gpt4 book ai didi

c++ - std::list - 迭代器是否在移动时失效?

转载 作者:可可西里 更新时间:2023-11-01 15:20:04 24 4
gpt4 key购买 nike

std::list 迭代器有一些非常好的属性——当任何其他元素被移除时,当一个新元素被添加时,甚至当 2 个列表被交换时,它们仍然有效(Iterator invalidation rules)!

考虑到以下代码行为,并且迭代器是通过一种指向实际节点的指针形式实现的,当列表移动时它不会改变,我的猜测是迭代器在新容器中仍然有效时 std::list 已移动,但我也可以通过访问实际上具有“预期”值的无效内存来进入 UB 区域。

std::list<int> l1{3, 2, 1};
std::list<int> l2;

auto it = std::prev(l1.end());
std::cout<<l1.size()<<" "<<l2.size()<<" "<<*it<<std::endl;

l2 = std::move(l1);
std::cout<<l2.size()<<" "<<*it<<std::endl;

3 0 1
3 1

如果 std::list 移动时迭代器仍然有效,是否由标准保证?其他容器呢?

最佳答案

对于一般的容器,只有 swap 保证迭代器保持有效(并指向交换的容器)。

对于 std::list,特殊成员函数 splice() 保证迭代器保留其预期的含义。

一般来说,从右值构造容器并不能保证迭代器;唯一的一般要求是新容器与最初构造它的容器具有“相同的值”。

(您可以想象存储对容器的引用的调试迭代器实现,并且该引用在移动后将变为悬空。)

关于c++ - std::list - 迭代器是否在移动时失效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26378894/

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