1.equal_range
template <class ForwardIterator, class T> pair <ForwardIterator, ForwardIterator> equal_range(ForwardIterator first, ForwardIterator last, const T& val);
用法:有序数组二分查找
int a[]={1,2,3,4,1,5}; vector<int> vec(a, a+6); pair< vector<int>::iterator, vector<int>::iterator > iter; iter = equal_range(vec.begin, vec.end(), 1); // iter = vec.equal_range(1);
iter.first是指向所查找元素的第一次出现的位置的迭代器,指向所查找元素最后一次出现位置的后一个位置的迭代器。
2.unique
template <class ForwardIterator> ForwardIterator unique (ForwardIterator first, ForwardIterator last);
去除相邻的重复元素(重复的只保留一个,多余的移到数列末尾,并没有删除),返回一个指向无重复元素的下一个的迭代器。(使用前一般会使序列有序)
//去除重复的元素 sort( vec.begin(), vec.end() ); vec.erase(unique(vec.begin(), vec.end()), vec.end());
3.sort:只能对序列式容器排序
template <class RandomAccessIterator, class Compare> void sort(RandomAccessIterator first, RandomAccessIterator last, Compare);
对整个序列进行划分,短的序列快排,长的序列继续递归划分,在递归过深的情况下堆排,序列过短采用插排。
bool myfunction(int i, int j){return (i < j);}; struct myclass{ bool operator()(int i, int j ){ return (i < j );}; } myobject; int a[]={1,3,2,5,4}; vector<int> vec(a, a + 8); sort(vec.begin(), vec.end()); //sort(vec.begin(), vec.end(), myfunction); //sort(vec.begin(), vec.end(), myobject);
4.reverse
//BidirectionalIterator双向迭代器 template<class BidirectionalIterator> void reverse(BidirectionalIterator first, BidirectionalIterator last);
将元素翻转,实际上操作是:iter_swap(first, last);
5.transform
template <class InputIterator, class OutputIterator, class UnaryOperation> OutputIterator transform (InputIterator first1, InputIterator last1, OutputIterator result, UnaryOperation op);
对 first1 和 last1 之间的元素进行 op 操作,并返回结果的 result 迭代器。
in op_increase(int i){return ++i}; vector<int> vec; for(int i = 0; i < 10; ++i) { vec.push_back(10 * i); } transform(vec.begin(), vec.end(), vec.begin(), op_increase); //vec:1、11、21、31、41...