這里已經提出了很多與 for range 相關的問題,但我找不到我需要的版本。所以,我在讀這本名為 C Primer 5th edition 的書,在閱讀有關 Vectors 的內容時,我讀到了一行陳述句,如果回圈體向 vector 添加元素, 我們就不能使用范圍。但就在這一行之前,撰寫了一個代碼部分,用于在運行時在向量中添加元素,即
vector<int> v2; // empty vector
for (int i = 0; i != 100; i)
v2.push_back(i); // append sequential integers to v2
// at end of loop v2 has 100 elements, values 0 . . . 99
我只想問,他們怎么會互相矛盾?還是它們完全不同并且彼此無關?如果第二個是條件,你能解釋一下這是如何作業的嗎?如果前者是正確的,你能解釋一下為什么代碼部分和陳述相互矛盾嗎?
uj5u.com熱心網友回復:
(除其他外)基于范圍的 for 回圈不應該附加元素的原因是因為在幕后,基于范圍的 for 回圈只是一個回圈,它從頭到尾遍歷容器的迭代器。而std::vector::push_back將所有的無效迭代器:
如果新的 size() 大于 capacity() 則所有迭代器和參考(包括過去的迭代器)都將失效。否則只有過去的迭代器無效。
然而,與使用迭代器相反,在索引向量時不能這樣說,因為即使 push_back 使迭代器無效,vec[3]將始終參考位置處的元素3(假設size() > 3)。
此外,您顯示的回圈甚至不會遍歷向量的元素。它只是向現有向量添加更多元素,而不是基于范圍的 for 回圈。
需要明確的是,可能會出現問題的構造如下:
std::vector<int> vec(10); // 10 times a zero
vec[0] = 1;
for (int k: vec)
if (k == 1)
vec.push_back(2); // invalidates iterators!
雖然這看起來等效的代碼是合法的:
std::vector<int> vec(10); // 10 times a zero
vec[0] = 1;
for (std::size_t i = 0; i < std::size(vec); i)
if (vec[i] == 1)
vec.push_back(2);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/405197.html
標籤:
上一篇:OpenCVHoughLines產生過多的Python行
下一篇:如何以有組織的方式回顯陣列專案?
