Dưới đây là một đoạn mã mà tôi đang tìm kiếm tại địa chỉ:Làm thế nào để lặp cập nhật sau khi phân bổ lại vector
vector<int> iv = {1,2,3,4,5,6,7,8,9,10};
auto iter = iv.begin(), mid = iv.begin() + iv.size()/2;
for(int count = 100; count; --count) {
iter = iv.insert(iter, - 1);
cout << "capacity = " << iv.capacity() << "*mid = " << *mid << endl;
}
Theo quy định huỷ bỏ hiệu lực iterator:
vector: tất cả các vòng lặp và tài liệu tham khảo trước khi điểm chèn không bị ảnh hưởng, trừ khi kích thước vùng chứa mới lớn hơn dung lượng trước đó (trong trường hợp đó tất cả các trình vòng lặp và tham chiếu đều bị vô hiệu) [23.2.4.3/1] Iterator invalidation rules
Tôi hiểu rằng vì tôi gán lại giá trị "lặp" tại mỗi chèn hoạt động, có lẽ tôi có thể duy trì nó hợp lệ ity (xin vui lòng sửa tôi nếu tôi sai). Tuy nhiên, trình vòng lặp "giữa" vẫn hợp lệ trong trường hợp này ngay cả khi tôi không giả mạo nó trong vòng lặp và cũng khi khả năng của vectơ đang thay đổi.
Vì vậy, "trung bình" có thể tự cập nhật sau khi phân bổ lại như thế nào?
Để biết liệu giữa đang thay đổi ở tất cả hay không, tôi đã thay đổi dòng 4 trong mã để:
iv.insert(iter, -1); // Did not assign it back to iter.
In kết quả của dereferencing giá trị ở giữa cho thấy sự thay đổi và có lẽ cũng ITER rằng không còn giá trị . (Một lần nữa, xin vui lòng sửa tôi nếu tôi sai).
Tại sao bạn cho rằng "giữa" vẫn hợp lệ? Tôi đoán đó là bởi vì (* giữa) in '6', nhưng nó chỉ là một iterator lơ lửng trỏ đến một nơi nào đó trong bộ nhớ free'd mà không thay đổi giá trị trước đó được nêu ra. Nếu bạn chạy valgrind, bạn sẽ nhận được rất nhiều quyền truy cập không hợp lệ vào bộ nhớ. – kukyakya