2011-06-19 12 views

Trả lời

7

Vâng, bộ của erase làm mất hiệu lực chỉ lặp mà trỏ đến yếu tố đó đã được xoá hoàn toàn (lưu ý rằng đây không nhất thiết phải đúng đối với tất cả các container).

+0

Cảm ơn bạn đã trả lời sớm ~ và điều gì sẽ xảy ra nếu sau khi xóa key1, Tôi chèn một key3 vào thử nghiệm? Tôi vẫn có thể sử dụng iter2 để chỉ key2? – cheng

+0

@ user508305: Có, chèn cũng không làm mất hiệu lực vòng lặp. –

3

Nói đúng, bạn phải kiểm tra giá trị trả lại của thao tác "chèn" và đảm bảo rằng key1key2 không so sánh bằng nhau; nếu không iter1 == iter2 và xóa iter1 invalidates iter2. Nhưng nói chung nhìn thấy câu trả lời trước đó, việc xóa một trình vòng lặp sẽ làm mất hiệu lực chỉ có trình lặp đó và không có người khác.

Ví dụ:

struct Foo 
{ 
    Foo(std::string s = "") : s(s) { } 
    bool operator<(const Foo & other) { return s.size() < other.size(); } 
} 

std::set<Foo> x; 
x.insert(Foo("Cat")); 
x.insert(Foo("Dog")); // booboo 
3

container Asociative thiết lập, MultiSet, bản đồ và Multimap được yêu cầu phải chỉ làm mất hiệu lực lặp và tham chiếu đến các yếu tố bị xóa.

Trong một deque tất cả các vòng lặp và tham chiếu bị vô hiệu, trừ khi các thành viên bị xóa đang ở cuối (trước hoặc sau) của deque (23.2.1.3/4), trong danh sách chỉ các trình vòng lặp và tham chiếu đến phần tử bị xóa không hợp lệ (23.2.2.3/3) và trên một vectơ mỗi vòng lặp và tham chiếu sau khi xóa điểm không hợp lệ (23.2.4.3/3)

+0

Bạn có tham khảo tiêu chuẩn cho quy tắc vùng chứa liên kết không? –

+0

Vâng, đó sẽ là '23.1.2/8' [lib.associative.reqmts]' Các thành viên chèn sẽ không ảnh hưởng đến tính hợp lệ của các trình vòng lặp và tham chiếu đến vùng chứa, và việc xóa thành viên sẽ làm mất hiệu lực chỉ các trình vòng lặp và tham chiếu đến xóa các yếu tố.' – lccarrasco