期間添加元素的矢量I已使用新的範圍爲基礎的由C++ 11標準提供的迴路和我想出了以下問題:假設我們迭代一個vector<>
使用基於範圍的for
,並且在迭代過程中我們在向量的末尾添加一些元素。因此,循環何時結束?基於範圍的環C++ 11
例如,查看此代碼:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<unsigned> test({1,2,3});
for(auto &num : test) {
cout << num << " ";
if(num % 2)
test.push_back(num + 10);
}
cout << "\n";
for(auto &num : test)
cout << num << " ";
return 0;
}
我 「-std = C++ 11」 標誌測試G ++ 4.8和蘋果LLVM版本4.2(鐺++),並且輸出是(對於兩種) :
1 2 3
1 2 3 11 13
注意,第一循環終止原向量的末尾,雖然我們添加其他元素,給它。似乎for-range循環僅在開始時評估容器結束。 這實際上是否是範圍正確的行爲?它是否由委員會規定?我們能相信這種行爲嗎?
注意,如果我們通過
for(vector<unsigned>::iterator it = test.begin(); it != test.end(); ++it)
無效的迭代器改變第一循環,並拿出分段錯誤。
儘管添加不是擦除,這是[在基於範圍的for循環內從容器中擦除元素]的副本(http://stackoverflow.com/questions/8624686/erasing-an-element- from-a-container-while-within-a-range-based-for-loop),因爲那裏的答案顯示了標準所說的範圍-for是 - 在循環開始之前確定並保存結束,並且保存的值在隨後的迭代中使用。 –
@KateGregory我會認爲這不是重複的,因爲刪除當前元素對所有容器都是未定義的行爲,但添加元素只對'std :: vector','std :: deque','std: :unordered_set'和'std :: unorderd_map'。 –
我看起來似乎是這個問題,由行爲略有不同。不管怎樣,謝謝。 –