2012-07-05 53 views
10

我想知道是什麼原因造成std::list<>::splice無效指向正在拼接到新容器的子序列的迭代器。這對我來說看起來不太合邏輯,特別是根據標準std::container::swap規範。根據語言標準std::container::swap不會使任何迭代器失效。這是一個完全合理的實際規格。但是,我會說std::list<>::splice也會從迭代器保留行爲中獲益很多。std :: list <> :: splice使迭代器無效。什麼道理呢?

我知道,基於迭代器可達性等概念可能存在一些純粹的學術考慮因素。但同時splice是特定操作,這意味着爲其提供定製的規範可能不會一般來說,對STL設計造成嚴重的概念性損害。

那是什麼?它會違法或過於複雜的std::list的一些實際實施,我不承認?

+0

[splice()on std :: list和迭代器失效的可能重複](http://stackoverflow.com/questions/143156/splice-on-stdlist-and-iterator-invalidation) – jwismar 2012-07-05 21:31:07

回答

7

在C++中11 splice不會使迭代器無效,而是使它們引用*this容器中的相應元素。這些在23.3.5.5中都有描述。

+0

哦,好的。剛剛發現。所以,顯然無效要求沒有很好的理由。我的問題大多發生在看到微軟必須在STL實現中跳過多少次循環和循環以提供對「swap」和「splice」的「迭代器調試」支持。感謝你的回答。 – AnT 2012-07-05 21:33:32

+0

@AndreyT「_So,顯然沒有理由要求失效。」不是。在某些時候,委員會希望完全支持_unequal_內存分配器,並且這些分配器不兼容,所以在這種非常特殊的情況下需要進行一些複製。 – curiousguy 2012-08-16 03:13:54

4

如果容器已經定製,不等於(不兼容)分配器,你不能交換指針,你別無選擇,只能真正複製元素。

相關問題