Tôi đã sử dụng phạm vi mới cho vòng lặp do chuẩn C++ 11 cung cấp và tôi đã đưa ra câu hỏi sau: giả sử rằng chúng ta lặp qua một vector<>
sử dụng phạm vi dựa trên for
và chúng tôi thêm một số phần tử vào cuối vectơ trong lần lặp này. Vì vậy, khi nào kết thúc vòng lặp?Thêm các phần tử vào một vector trong vòng lặp dựa trên dải C++ 11
Ví dụ, xem mã này:
#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;
}
Tôi đã thử nghiệm G ++ 4.8 và Apple LLVM phiên bản 4.2 (kêu vang ++) với "-std = C++ 11" cờ, và sản lượng là (cho cả hai) :
1 2 3
1 2 3 11 13
Lưu ý rằng vòng lặp đầu tiên chấm dứt vào cuối vector ban đầu, mặc dù chúng ta thêm các yếu tố khác với nó. Có vẻ như vòng lặp for-range chỉ đánh giá kết thúc của bộ chứa trong phần đầu. Đây có phải là hành vi chính xác của phạm vi? Nó có được chỉ định bởi ủy ban không? Chúng ta có thể tin tưởng vào hành vi này không?
Lưu ý rằng nếu chúng ta thay đổi vòng lặp đầu tiên bởi
for(vector<unsigned>::iterator it = test.begin(); it != test.end(); ++it)
với không hợp lệ các vòng lặp và đưa ra một lỗi segmentation.
mặc dù việc thêm không xóa, đây là bản sao của [Xóa một phần tử khỏi vùng chứa trong khi nằm trong phạm vi dựa trên phạm vi cho vòng lặp] (http://stackoverflow.com/questions/8624686/erasing-an-element- từ-một-container-trong-trong-một-dựa trên-cho-vòng lặp) bởi vì câu trả lời ở đó cho bạn thấy những gì tiêu chuẩn nói phạm vi cho không - kết thúc được xác định và lưu trước khi vòng lặp bắt đầu, và giá trị đã lưu được sử dụng trên các lần lặp tiếp theo. –
@KateGregory Tôi cho rằng đây không phải là bản sao vì việc loại bỏ phần tử hiện tại sẽ là hành vi không xác định cho tất cả các thùng chứa, nhưng việc thêm phần tử chỉ là hành vi không xác định cho 'std :: vector',' std :: deque', 'std: : unordered_set' và 'std :: unorderd_map'. –
Tôi dường như có câu hỏi đó, bởi hành vi này hơi khác một chút. Dù sao cũng cảm ơn. –