Đã có một vài câu hỏi liên quan đến vấn đề này trước đây; sự hiểu biết của tôi là việc gọi std::vector::erase
sẽ chỉ làm mất hiệu lực vòng lặp ở vị trí sau phần tử đã xóa. Tuy nhiên, sau khi xóa một phần tử, là iterator tại vị trí đó vẫn còn hợp lệ (cung cấp, tất nhiên, rằng nó không trỏ đến end()
sau khi xóa)?std :: vector iterator invalidation
Sự hiểu biết của tôi về cách một vectơ được triển khai dường như cho thấy rằng trình vòng lặp có thể sử dụng được, nhưng tôi không hoàn toàn chắc chắn nếu nó có thể dẫn đến hành vi không xác định.
Ví dụ về những gì tôi đang nói đến, đoạn mã sau xóa tất cả các số nguyên lẻ khỏi một vectơ. Mã này có gây ra hành vi không xác định không?
typedef std::vector<int> vectype;
vectype vec;
for (int i = 0; i < 100; ++i) vec.push_back(i);
vectype::iterator it = vec.begin();
while (it != vec.end()) {
if (*it % 2 == 1) vec.erase(it);
else ++it;
}
Mã chạy tốt trên máy tính của tôi, nhưng điều đó không thuyết phục tôi rằng nó hợp lệ.
Tại sao bạn vượt qua 'x' bằng cách tham chiếu const thay vì bằng giá trị? – fredoverflow
@Fred: Không có lý do cụ thể; cảm ơn vì đã chỉ ra điều đó. –
@James Nhưng sau đó làm thế nào trên mã được cung cấp trong câu hỏi là làm việc kể từ khi xóa sẽ làm mất hiệu lực vòng lặp? – Kapil