C++ 标准库值操作迭代器的常见函数

Posted zhanjxcom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 标准库值操作迭代器的常见函数相关的知识,希望对你有一定的参考价值。

迭代器是C++标准库中的重要组件,特别是在容器内部,没有迭代器,容器也就无所谓存在了。

例如:vector容器简而言之就是3个迭代器 start finish 以及end_of_storage vector的任何操作都离不开这3个迭代器。。

 

接下来,总结一下C++ 中的迭代器的操作。

C++的迭代器分为5类,依次为 : Input_iterator, output_iterator, forwrd_iterator, bidirectional_iterator 以及  random_access_iterator

访问的级别由低到高,

下面的相应的模板函数的参数是以  “可进行该操作的最小迭代器类型”为基础的。

 

 

函数 advance:

 

template <class InputIterator, class Distance>
  void advance (InputIterator& it, Distance n);

 

迭代器前进 n 个距离。如果是随机迭代器,直接 +n ,否则使用 ++ 操作移动。

使用方法:

list<int>::iterator it = myList.begin();

advance (it, 5);

 

函数distance:

 

template<class InputIterator>
  typename iterator_traits<InputIterator>::difference_type
    distance (InputIterator first, InputIterator last);

求的是迭代器first与last间 的元素的个数,如果是随机迭代器,直接使用 operator- 就好了,否则就要连续调用operator++操作符。

 

 

用法:

vector<int. A = {1,2,3,4}; // c++11

vector<int> ::iterator it = lower_bound(A.begin(), A.end(), 4);

distance(A.begin(), it); 

 

 

begin 和 end: 等价于容器中的begin与end。

比如下述遍历vector的方式:

vector<int> A  = {1,2,4,5,6};

for(auto it = A.begin(), it != A.end();  ++it) 

cout << *it << " " ;

cout << endl;

   等价于:

 

for(auto it = begin(A), it != end(A);  ++it) 

cout << *it << " " ;

cout << endl;

 

prev函数:返回迭代器的前n个位置的迭代器

 

template <class BidirectionalIterator>
  BidirectionalIterator prev (BidirectionalIterator it,
       typename iterator_traits<BidirectionalIterator>::difference_type n = 1);

 

 

例如要返回上述vector的最后一个元素:

cout  << prev(A.end() )  << endl;

 

要返回上述vector的倒数第3个元素:

cout  << prev(A.end() , 3)  << endl;

 

 

next函数:返回迭代器的后n个位置的迭代器:

 

template <class ForwardIterator>
  ForwardIterator next (ForwardIterator it,
       typename iterator_traits<ForwardIterator>::difference_type n = 1);

 

 

例如要返回上述vector的第二个元素

cout  << next(A.begin())  << endl;

第k个元素:

cout << next(A.begin(), k-1) << endl;

上述函数中,后四个函数是C++11新添加的函数。

以上是关于C++ 标准库值操作迭代器的常见函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 共享指针的行为不像迭代器的标准指针?

c++模拟实现string类

为啥 c++ 顺序访问迭代器的函数签名不使用指针?

深入理解C++迭代器:让你的C++代码更加灵活

c++ 迭代器库

c++泛型算法