STL: iterator適配器(2).

自C++11來iterator愈來愈成爲標準庫中的重要一環.ios

iterator分爲(這裏只是粗略的提一下,下一篇會詳細介紹):dom

Output-iterator, Input-iterator, Froward-iterator, Bidirectional-iterator, Random-access-iterator.這5種迭代器每種迭代器的能力不一樣,所以有的時候達不到咱們的要求。函數

標準庫提供了iterator相關的輔助函數:性能

  • advance()
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;
}
  • next()和prev()

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

相關文章
相關標籤/搜索