在STL中将指针转换为反向向量迭代器

时间:2009-10-02 21:59:08

标签: c++ stl iterator

我有

sort(arr, arr+n, pred);

如何按相反顺序排序?

7 个答案:

答案 0 :(得分:9)

似乎也有可能使用反向迭代器...除了使用反向谓词可能更容易,除非类型没有实现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));
}

答案 1 :(得分:4)

如果你被给予pred(即你无法进入它以扭转秩序),那就像:

std::sort(arr, arr+n, boost:bind<bool>(pred, _2, _1));

答案 2 :(得分:3)

您可以使用标准库中的greater自动调用operator>作为您要排序的类型。

#include <funcitonal>
.....
sort(arr, arr+n, greater<Type>()); // Type could be double for example

答案 3 :(得分:2)

取消pred的返回值。

答案 4 :(得分:1)

正如阿拉迪所说,你应该提供一个反向的谓词。如果由于某些原因(如纯粹的懒惰)你不能,你可以随时先排序然后反转:

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

这对计算机来说会更有用,但它很明确并且能够完成工作。如果您需要此类速度性能,请使用反向谓词解决方案。

答案 5 :(得分:0)

我觉得很容易

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;   
}

答案 6 :(得分:0)

sort(arr, arr+n, std::not1(pred));

请参阅:http://www.cplusplus.com/reference/std/functional/not1/