我有以下代碼:將設置的在C擦除功能++改變其它元件的地址?
set<Key> test;
test.insert(key1);
test.insert(key2);
iter1 = test.find(key1);
iter2 = test.find(key2);
test.erase(iter1);
我的問題是,如果KEY1被刪除了,現在我可以用iter2指鍵2測試?
感謝
我有以下代碼:將設置的在C擦除功能++改變其它元件的地址?
set<Key> test;
test.insert(key1);
test.insert(key2);
iter1 = test.find(key1);
iter2 = test.find(key2);
test.erase(iter1);
我的問題是,如果KEY1被刪除了,現在我可以用iter2指鍵2測試?
感謝
是,設置的erase
僅無效迭代器指向所刪除的元素(注意,這並不一定適用於所有容器)。
嚴格來說,您必須檢查「插入」操作的返回值,並確保key1
和key2
不會比較相等;否則iter1 == iter2
和擦除iter1
無效iter2
。但總體來看,前面的答案是,刪除一個迭代器只會使該迭代器失效,而不會使其他迭代器失效。
實施例:
struct Foo
{
Foo(std::string s = "") : s(s) { }
bool operator<(const Foo & other) { return s.size() < other.size(); }
}
std::set<Foo> x;
x.insert(Foo("Cat"));
x.insert(Foo("Dog")); // booboo
Asociative容器設置,需要多集,地圖和多重映射到僅無效迭代器和引用到擦除元件。
在雙端隊列所有的迭代器和引用被無效,除非擦除構件是在其端部(正面或背面)的一個列表中的雙端隊列(23.2.1.3/4) 的只有迭代器和引用到擦除元素無效(23.2.2.3/3),並在每次迭代器和參考擦除點失效後的矢量(23.2.4.3/3)
你有關聯容器規則,一個標準的參考嗎? –
是的,那將是'23.1.2/8' [lib.associative.reqmts]'插入元件不得影響迭代器和引用到容器的有效性,並擦除 成員應僅無效迭代器和引用到擦除的元素 – lccarrasco
謝謝你這麼快就回復〜什麼,如果擦除後KEY1,我插入另一個key3進入測試?我仍然可以使用iter2來引用key2嗎? – cheng
@ user508305:是的,插入不壞迭代器爲好。 –