Trong C ++, chúng ta có các vùng chứa khác nhau như vectơ, danh sách, tập hợp, bản đồ, v.v. Để lặp qua các vùng chứa, chúng ta có thể sử dụng các trình vòng lặp. Chúng ta nên cẩn thận khi sử dụng trình lặp trong C ++. Khi chúng ta sử dụng lặp qua một vùng chứa, thì đôi khi, nó có thể bị vô hiệu. Nếu hình dạng, kích thước bị thay đổi, thì chúng ta có thể phải đối mặt với loại vấn đề này. Trong ví dụ sau, chúng tôi xác định vấn đề vô hiệu.
Mã mẫu
#include <iostream> #include <vector> using namespace std; int main() { vector <int> vec{11, 55, 110, 155, 220}; for (auto it=vec.begin(); it!=vec.end(); it++) if ((*it) == 110) vec.push_back(89); //inserting a new value while iterating the vector for (auto it=vec.begin();it!=vec.end();it++) cout << (*it) << " "; }
Đầu ra
11 55 110 155 220 89 89
Trong chương trình này, chúng ta có thể nhận được các loại kết quả khác nhau. Ở đây kích thước của vectơ không phải là độ lớn hơn. Một số giá trị được cung cấp để khởi tạo. Bây giờ trong khi lặp lại, chúng tôi đang thêm một giá trị nữa. Trong trường hợp này, nếu vectơ không có khoảng trắng, nó sẽ tạo một khối bộ nhớ mới tại thời điểm đó và tất cả các mục sẽ được sao chép. Nhưng trình lặp sẽ được trỏ đến địa chỉ trước đó. Đối với điều này, nó có thể tạo ra một số lỗi không hợp lệ.
Hãy để chúng tôi xem một số quy tắc cho các trường hợp vô hiệu hóa trình lặp.
| Chèn | Xóa | Thay đổi kích thước |
---|---|---|---|
Vectơ | Tất cả các trình vòng lặp, đang trỏ một phần tử trước điểm chèn, không bị ảnh hưởng, nhưng các trình lặp khác sẽ bị vô hiệu. Và nếu kích thước của vectơ được tăng lên, thì tất cả các trình vòng lặp đều bị vô hiệu. | Tất cả các trình vòng lặp và tham chiếu, sau điểm xóa, đều bị vô hiệu. | Giống như chèn hoặc xóa. |
Deque | Tất cả các trình vòng lặp và các tham chiếu đều bị vô hiệu nếu mục được chèn không được chèn vào cuối deque. | Nếu các mục bị xóa khỏi bất kỳ vị trí nào ngoại trừ vị trí kết thúc, thì tất cả các trình vòng lặp sẽ bị vô hiệu. | Giống như chèn hoặc xóa. |
Danh sách | Tất cả các trình lặp và tham chiếu đều không bị ảnh hưởng | Chỉ những trình lặp hoặc tham chiếu trỏ đến phần tử sẽ bị xóa mới bị ảnh hưởng. | Giống như chèn hoặc xóa. |
Đặt, bản đồ, nhiều tập hợp, nhiều bản đồ | Tất cả các trình lặp và tham chiếu đều không bị ảnh hưởng | Chỉ những trình lặp hoặc tham chiếu trỏ đến phần tử sẽ bị xóa mới bị ảnh hưởng. | ---- |