STL Algorithm 算法

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...

 

posted @ 2017-10-25 21:09  小fanfan  阅读(106)  评论(0编辑  收藏  举报