【发布时间】:2009-10-02 21:59:08
【问题描述】:
我有
sort(arr, arr+n, pred);
如何倒序排列?
【问题讨论】:
-
pred 是你写的谓词吗?
我有
sort(arr, arr+n, pred);
如何倒序排列?
【问题讨论】:
似乎也有可能使用反向迭代器...除了使用反向谓词可能更容易,除非类型没有实现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));
}
【讨论】:
如果给您pred(即您无法进入其中以颠倒顺序),则类似于:
std::sort(arr, arr+n, boost:bind<bool>(pred, _2, _1));
【讨论】:
您可以使用标准库中的greater,它会自动调用operator> 来获取您想要排序的类型。
#include <funcitonal>
.....
sort(arr, arr+n, greater<Type>()); // Type could be double for example
【讨论】:
否定pred的返回值。
【讨论】:
正如alrady 所说,您应该提供一个反向谓词。如果由于某些原因(例如纯粹的懒惰)不能,您总是可以先排序然后反转:
sort(arr, arr+n, pred);
reverse( arr, arr+n );
这对计算机来说会做更多的工作,但它很清楚并且可以完成工作。如果您需要这种排序的速度性能,请使用反向谓词解决方案。
【讨论】:
我似乎很容易
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;
}
【讨论】:
sort(arr, arr+n, std::not1(pred));
【讨论】:
not1(pred(a,a)) 错误返回 true。这可能会导致sort() 挂起。