簡體   English   中英

std :: list - 移動時失效的迭代器是什么?

[英]std::list - are the iterators invalidated on move?

std::list迭代器有一些非常好的屬性 - 當刪除任何其他元素,添加新元素時,甚至當交換2個列表時,它們仍然有效( 迭代器失效規則 )!

考慮以下代碼行為並且迭代器是通過指向實際節點的指針形式實現的,當移動列表時它不會改變,我的猜測是當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()保證迭代器保持其預期含義。

通常,從rvalue構造容器不能保證迭代器; 唯一的一般要求是新容器與最初構造的容器具有“相同的值”。

(您可以想象調試迭代器實現,它存儲對容器的引用,並且該引用在移動后將變為懸空。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM