自C++11来iterator愈来愈成为标准库中的重要一环.ios
iterator分为(这里只是粗略的提一下,下一篇会详细介绍):dom
Output-iterator, Input-iterator, Froward-iterator, Bidirectional-iterator, Random-access-iterator.这5种迭代器每种迭代器的能力不一样,所以有的时候达不到咱们的要求。函数
标准库提供了iterator相关的辅助函数:性能
template< class InputIt, class Distance > constexpr void advance( InputIt& it, Distance n );
1,增长给定的迭代器使其向前或者向后移动n个位置.spa
2,对于Bidirectional-iterator和Random-access-iterator来讲,n能够为负值也能够为正值.code
3,Distance是个template类型。一般它必须是个整数类型,由于可能会调用++, <, --等操做还要和0 作比较.ci
4,advance()并不检查迭代器时候超过给定序列的end()(由于迭代器一般不知道其操做的容器,所以无从检查).因此,调用advance()有可能致使不明确的行为。string
Demo for advance()it
#include <iostream> #include <iterator> #include <forward_list> #include <vector> int main() { //case 1: Forward_iterator!!!! std::forward_list<int> fList{ 1, 2, 3, 5, 6, 7, 9 }; //注意std::forward_list里面的iterator和const_iterator都是 Forward_iterator类型的不支持 -, --等操做. std::forward_list<int>::const_iterator iter = fList.cbegin(); std::cout << "value1: " << *iter << std::endl; std::cout << "value2: " << *(++iter) << std::endl; //error不支持递减. //std::cout << "value3: " << *(--iter) << std::endl; //可是咱们如今每次递增一个太慢了咱们想要一次跨越几个. std::advance(iter, 3); std::cout << "value3: " << *iter << std::endl; //case 2: Random-access-iterator!!!!!!!!!! std::vector<int> vec{ 1, 2, 3, 4, 5, 6, 8 }; //注意std::vector里面的iterator和const_iterator都是Random-access-iterator. std::vector<int>::const_iterator v_iter = vec.cbegin(); std::cout << "value4: " << *v_iter << std::endl; std::cout << "value5: " << *(++v_iter) << std::endl; std::cout << "value6: " << *(--v_iter) << std::endl; std::advance(v_iter, 3); std::cout << "value7: " << *v_iter << std::endl; std::advance(v_iter, -1); std::cout << "value8: " << *v_iter << std::endl; return 0; }
Another Demo:io
#include <iostream> #include <iterator> #include <forward_list> #include <vector> #include <string> #include <algorithm> int main() { std::istream_iterator<std::basic_string<char>> cinPos(std::cin); std::ostream_iterator<std::basic_string<char>> coutPos(std::cout, " "); while (cinPos != std::istream_iterator<std::basic_string<char>>()) { std::advance(cinPos, 2); if (cinPos != std::istream_iterator<std::basic_string<char>>()) { *coutPos = *cinPos++; } } std::cout << std::endl; return 0; }
std::next()
template< class InputIt > constexpr InputIt next( InputIt it, typename std::iterator_traits<InputIt>::difference_type n = 1 );
1,致使Forward迭代器或者Input迭代器向前移动1个或者n个位置
2,若是处理的是Bidirectional-iterator和Random-access-iterator的话n的值能够为负值(致使后退).
3,n的类型是 typename std::iterator_traits<iter>::difference_type.
4,注意next()并不检查是否会跨越序列的end().
std::prev()
template< class BidirIt > constexpr BidirIt prev( BidirIt it, typename std::iterator_traits<BidirIt>::difference_type n = 1 );
1,致使Bidirectional迭代器后退1个或者n个位置.
2,n能够为负值,致使向前移动。
3,Dist的类型为 typename std::iterator_traits<BidirIt>::difference_type.
4,注意prev()并不检查是否会超过序列的begin()或者cbegin().
//std::distance()做为了解就好了 性能并很差。。。
std::distance()
template< class InputIt > constexpr typename std::iterator_traits<InputIt>::difference_type distance( InputIt first, InputIt last );
1,返回两个iterator first和last之间的距离.
2,first和last必须指向同一个迭代器.
3,若是不是Random-access-iterator,则从first开始前进必须可以到达last,亦last的位置必须在first以后,或者与first的位置相同.
4,该函数的返回类型为: typename std::iterator_traits<Itr>::difference_type