來自檔案:
迭代器失效:
重新散列 | 總是
我正在嘗試使迭代器無效。但即使在手動呼叫后它仍然有效rehash()。
測驗樣品:
std::unordered_set<int> set;
set.insert(10);
auto it = set.begin();
const int& ref = *it;
for(int i = 0; i < 10; i) {
set.insert(i);
std::cout << *it << " | " << ref << " : " << set.load_factor() << " / " << set.max_load_factor() << std::endl;
}
set.rehash(100);
std::cout << *it << " | " << ref << " : " << set.load_factor() << " / " << set.max_load_factor() << std::endl;
標準輸出:
10 | 10 : 1 / 1
(rehash)
10 | 10 : 0.6 / 1
10 | 10 : 0.8 / 1
10 | 10 : 1 / 1
(rehash)
10 | 10 : 0.545455 / 1
10 | 10 : 0.636364 / 1
10 | 10 : 0.727273 / 1
10 | 10 : 0.818182 / 1
10 | 10 : 0.909091 / 1
10 | 10 : 1 / 1
10 | 10 : 0.108911 / 1
uj5u.com熱心網友回復:
我正在嘗試使迭代器無效。
呼叫rehash確實使迭代器無效。
但即使在手動呼叫 rehash() 之后它仍然有效。
不是它不保持有效。
您沒有明確說明的是:您獲得了預期的輸出,因此得出結論認為迭代器仍然有效。
您無法測驗迭代器是否有效。取消參考無效的迭代器是未定義的。結果可以是任何東西(包括看似正確的結果)。通俗地講,“無效”的意思是“不保證有效”,并不表示“保證失敗”。這通常是未定義行為的情況。您無法從正確的輸出中得出代碼正確的結論。
一個有點愚蠢但恕我直言有點有用的類比是一個壞掉的計算器。它已經交換*了。 你要求得到的2 2結果4。看起來是正確的,但從中你不能斷定計算器沒有壞。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/517229.html
標籤:C stl迭代器
