C++反向迭代器
反向迭代器是C++標準庫提供的一種適配器,它允許我們以相反的順序遍歷容器,反向迭代器是正向迭代器的封裝。
迭代器可以分為兩類:
-
方向性質:
-
單向迭代器(Forward Iterator)
-
雙向迭代器(Bidirectional Iterator)
-
隨機訪問迭代器(Random Access Iterator)
-
輸入迭代器(Input Iterator)
-
輸出迭代器(Output Iterator)
-
-
遍歷方向:
-
正向迭代器(iterator)
-
反向迭代器(reverse_iterator)
-
特性 | 輸入迭代器 | 輸出迭代器 | 單向迭代器 | 雙向迭代器 | 隨機迭代器 |
---|---|---|---|---|---|
讀(*iter ) | ? | ? | ? | ? | |
寫(*iter = ) | ? | ? | ? | ? | |
++ | ? | ? | ? | ? | ? |
– | ? | ? | |||
+ | ? | ||||
- | ? |
-
常見的單向迭代器:
forward_list
、unordered_map
、unordered_set
-
常見的雙向迭代器:
list
、map
、set
-
常見的隨機迭代器:
vector
、string
、deque
支持反向迭代器,普通迭代器必須支持 ++
、--
運算符操作。
代碼實現
// reverse_iterator.hpp
#pragma oncenamespace simulate_reverse_iterator {template<typename Iterator , typename Ref , typename Ptr>struct reverse_iterator {typedef reverse_iterator<Iterator , Ref , Ptr> self;reverse_iterator(Iterator iter) :iterator(iter) {}Ref operator*() {self temp(iterator);return *--temp;}Ptr operator->() {return &(operator*());}self& operator++() {return --iterator;}self& operator--() {return ++iterator;}bool operator==(const self& s) {return iterator == s.iterator;}bool operator!=(const self& s) {return iterator != s.iterator;}Iterator iterator;};
}
注意事項
-
反向迭代器的
operator*
返回的是前一個位置的元素,這是為了保持與正向迭代器相同的半開區間語義。-
rbegin()
?對應正向迭代器的end()
-
rend()
?對應正向迭代器的begin()
-
-
反向迭代器的
++
操作是對應正向迭代器的--
操作,--
操作時對應正向迭代器的++
操作。