| 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. |
| 概要: | 反序迭代器適配器以相反的方向遍歷被改編的迭代器的區間。 |
|---|
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.
Iterator 必須符合雙向遍歷迭代器。類型 iterator_traits<Iterator>::reference 必須是 *i 的類型,其中 i 為類型 Iterator 的一個對象。
reverse_iterator 的特化類所符合的迭代器遍歷概念和迭代器訪問概念與它的 Iterator 參數所符合的相同。此外,它還可能符合下表中所指定的舊式迭代器概念:
| 如果 I 符合 | 則 reverse_iterator<I> 符合 |
|---|---|
| 可讀左值迭代器,雙向遍歷迭代器 | 雙向迭代器 |
| 可寫左值迭代器,雙向遍歷迭代器 | 非常量雙向迭代器 |
| 可讀左值迭代器,隨機訪問遍歷迭代器 | 隨機訪問迭代器 |
| 可寫左值迭代器,隨機訪問遍歷迭代器 | 非常量隨機訪問迭代器 |
reverse_iterator<X> 與 reverse_iterator<Y> 可交互,當且僅當 X 與 Y 是可交互的。
除了 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!
該例子的源代碼請見 這裡。