反序迭代器

Author: David Abrahams, Jeremy Siek, Thomas Witt
Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization: Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction
Date: 2006-09-11
Copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
概要: 反序迭代器適配器以相反的方向遍歷被改編的迭代器的區間。

目錄

reverse_iterator 概要

template <class Iterator>
class reverse_iterator
{
public:
typedef iterator_traits<Iterator>::value_type value_type;
typedef iterator_traits<Iterator>::reference reference;
typedef iterator_traits<Iterator>::pointer pointer;
typedef iterator_traits<Iterator>::difference_type difference_type;
typedef /* 見下文 */ iterator_category;

reverse_iterator() {}
explicit reverse_iterator(Iterator x) ;

template<class OtherIterator>
reverse_iterator(
reverse_iterator<OtherIterator> const& r
, typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
);
Iterator const& base() const;
reference operator*() const;
reverse_iterator& operator++();
reverse_iterator& operator--();
private:
Iterator m_iterator; // exposition
};

如果 Iterator 符合隨機訪問遍歷迭代器及可讀左值迭代器,則 iterator_category 可轉換為 random_access_iterator_tag. 否則,如果 Iterator 符合雙向遍歷迭代器及可讀左值迭代器,則 iterator_category 可轉換為 bidirectional_iterator_tag. 否則,iterator_category 可轉換為 input_iterator_tag.

reverse_iterator 的要求

Iterator 必須符合雙向遍歷迭代器。類型 iterator_traits<Iterator>::reference 必須是 *i 的類型,其中 i 為類型 Iterator 的一個對象。

reverse_iterator 的模型

reverse_iterator 的特化類所符合的迭代器遍歷概念和迭代器訪問概念與它的 Iterator 參數所符合的相同。此外,它還可能符合下表中所指定的舊式迭代器概念:

如果 I 符合 則 reverse_iterator<I> 符合
可讀左值迭代器,雙向遍歷迭代器 雙向迭代器
可寫左值迭代器,雙向遍歷迭代器 非常量雙向迭代器
可讀左值迭代器,隨機訪問遍歷迭代器 隨機訪問迭代器
可寫左值迭代器,隨機訪問遍歷迭代器 非常量隨機訪問迭代器

reverse_iterator<X>reverse_iterator<Y> 可交互,當且僅當 XY 是可交互的。

reverse_iterator 的操作

除了 reverse_iterator 符合的概念所要求的操作以外,reverse_iterator 還提供了以下操作。

reverse_iterator();

要求: Iterator 必須是可缺省構造的。
作用: 構造一個 reverse_iterator 實例,帶有缺省構造的 m_iterator.

explicit reverse_iterator(Iterator x);

作用: 構造一個 reverse_iterator 實例,帶有從 x 複製構造所得的 m_iterator.
template<class OtherIterator>
reverse_iterator(
reverse_iterator<OtherIterator> const& r
, typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
);
要求: OtherIterator 可隱式轉換為 Iterator.
作用: 構造一個 reverse_iterator 實例,其 m_iterator 子對像構造自 y.base().

Iterator const& base() const;

返回: m_iterator

reference operator*() const;

作用:
Iterator tmp = m_iterator;
return *--tmp;

reverse_iterator& operator++();

作用: --m_iterator
返回: *this

reverse_iterator& operator--();

作用: ++m_iterator
返回: *this
 
template <class BidirectionalIterator>
reverse_iterator<BidirectionalIterator>n
make_reverse_iterator(BidirectionalIterator x);
返回: 一個 reverse_iterator<BidirectionalIterator> 實例,其 current 構造自 x.

例子

以下例子使用 reverse_iterator 以反序打印一個字符數組.

char letters_[] = "hello world!";
const int N = sizeof(letters_)/sizeof(char) - 1;
typedef char* base_iterator;
base_iterator letters(letters_);
std::cout << "original sequence of letters:\t\t\t" << letters_ << std::endl;

boost::reverse_iterator<base_iterator>
reverse_letters_first(letters + N),
reverse_letters_last(letters);

std::cout << "sequence in reverse order:\t\t\t";
std::copy(reverse_letters_first, reverse_letters_last,
std::ostream_iterator<char>(std::cout));
std::cout << std::endl;

std::cout << "sequence in double-reversed (normal) order:\t";
std::copy(boost::make_reverse_iterator(reverse_letters_last),
boost::make_reverse_iterator(reverse_letters_first),
std::ostream_iterator<char>(std::cout));
std::cout << std::endl;

輸出結果是:

original sequence of letters:                   hello world!
sequence in reverse order: !dlrow olleh
sequence in double-reversed (normal) order: hello world!

該例子的源代碼請見 這裡