迭代器值与转换后的反向迭代器值不同

Adr*_*ian 1 c++ iterator stl

我有以下代码:

int main()
{
    vector<int> v;

    for(int i = 0; i < 10; ++i)
        v.push_back(i);

    auto it = v.begin() + 3;

    cout << "Iterator: " << *it << endl;

    vector<int>::reverse_iterator revIt(it);

    cout << "Reverse iterator: " << *revIt << endl;

}
Run Code Online (Sandbox Code Playgroud)

运行此代码后,我得到以下输出:

Iterator: 3
Reverse iterator: 2
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么2个值不同?

Mic*_*urr 5

反向迭代器'对应'到具有base一个元素的偏移量的迭代器,因为如何rbegin()rend()必须使用有效(end()begin()分别)的基础迭代器来表示.例如,rend()不能由在容器的begin()迭代器之前"指向"的交互器表示,尽管这是它在逻辑上表示的内容.所以rend()'基础迭代器'是begin().因此,rbegin()基础迭代器就变成了end().反向迭代器在取消引用时(使用*->运算符)自动调整该偏移量.

Scott Meyers的一篇文章详细解释了这种关系以及一幅精美的图片:

准则3:了解如何使用reverse_iterator的Base迭代器

在reverse_iterator上调用基本成员函数会产生"相应的"迭代器,但这并不是很清楚这意味着什么.举个例子,看一下这个代码,它将数字1-5放在一个向量中,将reverse_iterator设置为指向3,并将一个迭代器设置为reverse_iterator的基数:

vector<int> v;

// put 1-5 in the vector
for (int i = 1; i <= 5; ++i) {
  v.push_back(i);
}

// make ri point to the 3
vector<int>::reverse_iterator ri =
  find(v.rbegin(), v.rend(), 3);

// make i the same as ri's base
vector<int>::iterator i(ri.base());
Run Code Online (Sandbox Code Playgroud)

执行此代码后,可以将事物视为如下所示:

替代文字

这张图片很漂亮,显示了reverse_iterator的特征偏移量及其相应的基本迭代器,它模仿了rbegin()和rend()相对于begin()和end()的偏移量,但它没有告诉你所需要的一切知道.特别是,它没有解释如何使用i来执行您想要在ri上执行的操作.