反向迭代器

如果我們想要向後遍歷列表或向量,我們可以使用 reverse_iterator。反向迭代器由雙向或隨機訪問迭代器構成,它作為成員儲存,可以通過 base() 訪問。

要向後迭代,請使用 rbegin()rend() 作為集合結束的迭代器,以及集合的開始。

例如,向後迭代使用:

std::vector<int> v{1, 2, 3, 4, 5};
for (std::vector<int>::reverse_iterator it = v.rbegin(); it != v.rend(); ++it)
{
    cout << *it;
} // prints 54321

可以通過 base() 成員函式將反向迭代器轉換為前向迭代器。關係是反向迭代器引用一個元素超過 base() 迭代器:

std::vector<int>::reverse_iterator r = v.rbegin();
std::vector<int>::iterator i = r.base();
assert(&*r == &*(i-1)); // always true if r, (i-1) are dereferenceable
                        // and are not proxy iterators

 +---+---+---+---+---+---+---+
 |   | 1 | 2 | 3 | 4 | 5 |   |
 +---+---+---+---+---+---+---+
   ↑   ↑               ↑   ↑
   |   |               |   |
rend() |         rbegin()  end()
       |                   rbegin().base()
     begin()
     rend().base()

在迭代器標記元素之間位置的視覺化中,關係更簡單:

  +---+---+---+---+---+
  | 1 | 2 | 3 | 4 | 5 |
  +---+---+---+---+---+
  ↑                   ↑
  |                   |
  |                 end()
  |                 rbegin()
begin()             rbegin().base()
rend()
rend().base()