- 论坛徽章:
- 0
|
这里有一个你并不想那么做的例子:
vector<int> v; // 建立一个vector,
... // 把一些数据放进去
sort(v.begin(), v.end(), greater<int>()); // 降序排列
... // 使用这个vector
// (没有改变它)
bool a5Exists = // 在这个vector中搜索5
binary_search(v.begin(), v.end(), 5); // 假设它是升序排列!
默认情况下,binary_search假设它搜索的区间是以“<”排序(也就是,值是升序),但在本例中,这个
vector是降序。当你在值的排列顺序和算法所期望的不同的区间上调用binary_search (或lower_bound等)会导
致未定义的结果时,你不该惊奇。
要让代码行为正确,你必须告诉binary_search要使用和sort同样的比较函数:
bool a5Exists = // 搜索5
binary_search(v.begin(), v.end(), 5. greater<int>()); // 把greater作为
// 比较函数
所有需要有序区间的算法(也就是除了unique和unique_copy外本条款的所有算法)通过等价来判断两个值是
否“相同”,就像标准关联容器(它们本身是有序的)。相反,unique和unique_copy判断两个对象“相
同”的默认方式是通过相等,但是你可以通过传给这些算法一个定义了“相同”的意义的判断式来覆盖这个
默认情况。等价和相等之间区别的详细讨论,参考条款19。
11个需要有序区间的算法为了比其他可能性提供更好的性能而这么做。只要你记住只传给它们有序区间,只
要你保证用于算法的比较函数和用于排序的一致,你就会酷爱没有麻烦的查找、设置和合并操作,加上你会
发现unique和unique_copy除去了所有的重复值,正如你要它们完成的一样。 |
|