我有以下代码:
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个值不同?
反向迭代器'对应'到具有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的基数:
Run Code Online (Sandbox Code Playgroud)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());
执行此代码后,可以将事物视为如下所示:
这张图片很漂亮,显示了reverse_iterator的特征偏移量及其相应的基本迭代器,它模仿了rbegin()和rend()相对于begin()和end()的偏移量,但它没有告诉你所需要的一切知道.特别是,它没有解释如何使用i来执行您想要在ri上执行的操作.
归档时间: |
|
查看次数: |
544 次 |
最近记录: |