STL中的一些算法默认区间是有序的,忽视这个条件可能会导致编译器报错,甚至更糟的情况:编译运行正常但返回错误答案。
以下11个算法必须保证给出的区间是有序的,否则会造成未定义的运行期行为:
binary_search,lower_bound,upper_bound,equal_range,set_union,set_intersection,set_difference,set_symmetric_difference,merge,inplace_merge,includes
另外有2个算法一般用于有序区间,虽然它们不要求:
unique,unique_copy
正确的用法例如:
vector<int> v = {1, 5, 3, 4, 2};
sort(v.begin(), v.end());
lower_bound(v.begin(), v.end(), 3);//正确 返回指向3的iterator
错误的用法:
vector<int> v = {1, 5, 3, 4, 2};
lower_bound(v.begin(), v.end(), 3);//错误!返回错误的iterator!
宽泛的说,只要保证这些算法使用和sort相同的比较函数,例如:
sort(v.begin(), v.end(), cmp);//正确 cmp为比较函数的函数名
lower_bound(v.begin(), v.end(), 3, cmp);
至于unique,它的作用是:区间内相邻且相等的元素只保留第一个。所以不排序它也可以正常工作,但更多的情况是先排序再去重。
另外unique类似remove,并不会真正删除元素,详情参考EC3-32,EC3-33。