gpt4 book ai didi

c++ - 为什么删除列表的_first_ 元素会使 `.rend()` 无效?

转载 作者:可可西里 更新时间:2023-11-01 16:28:13 26 4
gpt4 key购买 nike

使用 XCode 4.6 在 Mac OS X 上测试。

此示例代码显示删除 std::list 的最后一个元素如我所料:对 list::end() 的迭代器引用仍然是“1过去了”并且仍然有效,即使删除了最后一个元素

但是第二个例子反驳了我的直觉。删除列表的 first 元素更改 list::rend(),我认为它是“1 past the beginning”。

我的期望错了吗?为什么错了?为什么您通过删除最后一个元素对“1 past the end”的引用仍然有效(不应该吗?),但对“1 在开头前面的引用”(.rend())删除前面的元素后变得无效?

void printList( list<int>& os )
{
for( int& i : os )
printf( "%d ", i ) ;
puts("");
}

void testList()
{
list< int > os ;
os.push_back( 1 ) ;
os.push_back( 2 ) ;
os.push_back( 3 ) ;
os.push_back( 4 ) ;
os.push_back( 5 ) ;

// Forward iterators: reference to .end() not invalidated when remove last elt.
list<int>::iterator fwdEnd = os.end() ;
printList( os ) ;
os.erase( --os.end() ) ; // remove the 5 (last elt)
printList( os ) ;
if( fwdEnd == os.end() ) puts( "YES, fwdEnd==os.end() still, iterators not invalidated" ) ; // I get __this__ result
else puts( "NO: fwdEnd INVALIDATED" ) ;



list<int>::reverse_iterator revEnd = os.rend() ;
// remove the front element
printList( os ) ;
os.erase( os.begin() ) ; // removes the 1
printList( os ) ;
if( revEnd == os.rend() ) puts( "YES revEnd is still valid" ) ;
else puts( "NO: revEnd NOT valid" ) ; // I get __this__ result
}

最佳答案

这是因为反向迭代器的引用逻辑与常规迭代器略有不同:它指向一个元素,但在取消引用时,它会产生对前一个元素的引用。

如果您尝试以下操作,您将很容易看到这一点:

#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
vector<int> v = { 1, 2, 3, 4, 5, 6 };
auto i = find(begin(v), end(v), 3);
cout << *i << endl;

vector<int>::const_reverse_iterator ri(i);
cout << *ri << endl;
}

输出应该是:

3
2

当反向迭代器物理上指向某个元素时,它逻辑上指向它之前的元素。因此,反向迭代器在物理上指向索引为 i 的集合中的元素,当取消引用时,会产生(对)索引为 i-1 的元素:

                       i, *i
|
- 1 2 3 4 5 6 -
| |
*ri ri

这就是为什么 rend() 返回的迭代器实际上指向集合中的第一个元素,而不是第一个元素之前的元素。因此,删除第一个元素会使它无效。

           begin, *begin                       end, *end
| |
- 1 2 3 4 5 6 -
| | | |
*rend rend *rbegin rbegin

这不仅适用于列表,还适用于所有提供双向迭代器的集合。

关于c++ - 为什么删除列表的_first_ 元素会使 `.rend()` 无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14760134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com