c++中迭代器与几种简单的算法

来源:互联网 发布:linux 重启机器 编辑:程序博客网 时间:2024/05/16 08:09
  • 从语言的层次:

  容器Container是个class template;
  算法Algorithm是个function template;
  迭代器Iterator是个class template;
  仿函数Function是个class template;
  适配器Adapter是个class template;
  分配器Allocator是个clsaa template;
  Algorithm看不见Containers,对其一无所知;所以,它所需要的一些信息都必须从Iterators取得,而Iterators(由Containers供应)必须能够回答Algorithm的所有提问,才能搭配该Algorithm的所有操作。

//STL库中算法的形式template<typename Iterator>Algorithm(Iterator itr1,Iterator itr2){}//或template<typename Iterator,template Cmp>Algorithm(Iterator itr1,Iterator itr2,Cmp comp){}
  • 迭代器的分类
      各种容器的iterators的iterator_category有:
//五种iterator categorystruct input_iterator_tag{};struct output_iterator_tag{};struct forword_iterator_tag:public input_iterator_tag{};struct bidirectional_iterator_tag:public forward_iterator_tag{};struct random_access_iterator_tag:public bidirectional_iterator_tag{};
  • iterator_category对算法的影响:主要体现在执行的效率。
  • iterator_category和type traits对算法的影响:
  • 这里写图片描述
  • iterator traits和type traits对算法的影响:
  • image
    image

  • C++ 中算法
      简单提一下C++STL库中的几种简单的算法:

    1. accumulate,如下:
template<class InputIterator,class T>T accumulate(InputIterator first, InputIterator last, T init){    for (;first != last;++first)        init = init + *first;    return init;}//通常算法有两个版本template<class InputIterator,class T,class BinaryOperation>T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op){    for (;first != last;++first)        init = binary_op(init, *first);    return init;}
  1. 算法 for_each:既在一段范围内对每一个元素做一件制定的事情(形式如下)
template<class InputIterator, class Function>T for_each(InputIterator first, InputIterator last, Function f){    for (;first != last;++first)        f(*first);    return f;}

3.算法replace,replace_if,replace_copy这里简单的写了一个replace算法的代码:

template<class InputIterator, class T>T replace(InputIterator first, InputIterator last, const T& old_value,    const T& new_value){    for (;first != last;++first)        if (*first == old_value)            *first = new_value;}

4.算法count,count_if

template<class InputIterator, class T>typename iterator_traits<InputIterator>::difference_typecount(InputIterator first, InputIterator last, const T& value){    typename iterator_traits<InputIterator>::difference_type n = 0;    for (;first != last;++first)        if (*first == value)            ++n;    return n;}

5.算法find,find_if

template<class InputIterator, class T>find(InputIterator first, InputIterator last, const T& value){    while (first != last&&*first != value)        ++first;    return first;}

  注意:容器array、vector、list、forward_list、deque而言他们自身是不带成员函数count()、find()的;但是容器set/multiset、map/multimap、unordered_set/unordered_multiset、unordered_map/unorderd_multimap而言他们自身的成员函数中带有count()、find()。

  注意:容器list、forward_list的成员函数中带有sort()。

原创粉丝点击