преобразовать указатель в итератор обратного вектора в STL - PullRequest
0 голосов
/ 03 октября 2009

у меня

sort(arr, arr+n, pred);

Как сортировать в обратном порядке?

Ответы [ 7 ]

9 голосов
/ 03 октября 2009

Кажется также, что есть возможность использовать обратные итераторы ... за исключением того, что использование обратного предиката может быть проще, за исключением случаев, когда тип не реализует operator>:)

#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
    int arr[4] = { 3, 2, 5, 4 };
    std::sort(std::reverse_iterator<int*>(arr + 4), std::reverse_iterator<int*>(arr));
}
4 голосов
/ 03 октября 2009

Если вам дано pred (то есть вы не можете попасть внутрь, чтобы изменить порядок), что-то вроде:

std::sort(arr, arr+n, boost:bind<bool>(pred, _2, _1));
3 голосов
/ 03 октября 2009

Вы можете использовать greater из стандартной библиотеки, которая автоматически вызывает operator> для типа, который вы хотите отсортировать.

#include <funcitonal>
.....
sort(arr, arr+n, greater<Type>()); // Type could be double for example
2 голосов
/ 03 октября 2009

Отрицательное значение возврата pred.

1 голос
/ 03 октября 2009

Как сказал Алради, вы должны предоставить обратный предикат. Если вы не можете по каким-либо причинам (например, из-за чистой лени), вы всегда можете сначала отсортировать, а затем развернуть:

sort(arr, arr+n, pred);
reverse( arr, arr+n );

Это было бы больше работы для компьютера, но это понятно и делает свою работу. Если вам нужна скорость для этого вида, используйте решение с обращенными предикатами.

0 голосов
/ 03 октября 2009
sort(arr, arr+n, std::not1(pred));

См .: http://www.cplusplus.com/reference/std/functional/not1/

0 голосов
/ 03 октября 2009

Довольно легко, мне кажется

std::sort(myVec.rbegin(),myVec.rend());


int main() 
{
    typedef std::vector<int> vecType;
    vecType myVec;
    for(int a=0;a<20;a++)
    {
        myVec.push_back((rand()%100));
    }
    std::copy(myVec.begin(), myVec.end(), std::ostream_iterator<int>(std::cout, "\n"));
    cout<<"\n---------------------------------------------------\n";
    std::sort(myVec.rbegin(),myVec.rend());
    std::copy(myVec.begin(), myVec.end(), std::ostream_iterator<int>(std::cout, "\n"));
    return 0;   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...