iterator catagoly
迭代器种类
- input 向后读
- output 向后写
- forward 向后读写
- bidrectional 先后读写
- random 随机读写
advance 与 next
除了random 种类的迭代器,其他的都无法随机访问,但是STL算法为我们提供了随机访问的机会,就是通过advance 和 next函数。
不同点
1 首先语法不同,advance 没有返回值,next 返回一个目标位置的迭代器。next 有缺省值,advance 没有
template
void advance( InputIt& it, Distance n );
it: Iterator to be advanced
n: Distance to be advanced
// Definition of std::next()
ForwardIterator next (ForwardIterator it,
typename iterator_traits::difference_type n = 1);
it: Iterator pointing to base position
n: Distance to be advanced from base position.
2 使用上,一个是输入参数,一个输入输出参数。这意味着advance 会修改传入的参数,但是next不会。
// C++ program to demonstrate
// std::advance vs std::next
#include <iostream>
#include <iterator>
#include <deque>
#include <algorithm>
using namespace std;
int main()
{
// Declaring first container
deque<int> v1 = { 1, 2, 3 };
// Declaring second container for
// copying values
deque<int> v2 = { 4, 5, 6 };
deque<int>::iterator ii;
ii = v1.begin();
// ii points to 1 in v1
deque<int>::iterator iii;
iii = std::next(ii, 2);
// ii not modified
// For std::advance
// std::advance(ii, 2)
// ii modified and now points to 3
// Using copy()
std::copy(ii, iii, std::back_inserter(v2));
// v2 now contains 4 5 6 1 2
// Displaying v1 and v2
cout << "v1 = ";
int i;
for (i = 0; i < 3; ++i) {
cout << v1[i] << " ";
}
cout << "\nv2 = ";
for (i = 0; i < 5; ++i) {
cout << v2[i] << " ";
}
return 0;
}
Output:
v1 = 1 2 3
v2 = 4 5 6 1 2
3 最重要的,advance 可以接受任何类型迭代器,而next 只能接收 forward 之后种类的迭代器