2009-04-17 23 views
11

Tôi đang lên kế hoạch triển khai danh sách Những điều trong C++ nơi các thành phần có thể bị xóa theo thứ tự. Tôi không mong đợi rằng tôi sẽ cần bất kỳ loại truy cập ngẫu nhiên nào (tôi chỉ cần quét danh sách theo định kỳ) và thứ tự các mục cũng không quan trọng.Tuổi thọ và tính hợp lệ của trình lặp C++ là gì?

Vì vậy, tôi nghĩ đến std::list<Thing*> with this->position = insert(lst.end(), thing) nên thực hiện thủ thuật. Tôi muốn lớp Thing nhớ vị trí của từng trường hợp để sau này tôi có thể dễ dàng làm lst.erase(this->position) trong thời gian không đổi.

Tuy nhiên, tôi vẫn còn hơi mới đối với vùng chứa C++ STL và tôi không biết liệu có an toàn để giữ các trình lặp trong một thời gian dài như vậy hay không. Đặc biệt, cho rằng sẽ có các yếu tố khác bị xóa trước và sau khi đưa Thing trước khi nó biến mất.

Trả lời

13

Trong danh sách tất cả các trình vòng lặp vẫn hợp lệ trong quá trình chèn và chỉ các trình vòng lặp để các phần tử bị xóa không hợp lệ trong quá trình xóa.

Trong trường hợp giữ trình lặp của bạn nên được sử dụng tốt ngay cả khi các yếu tố khác bị xóa trước và sau Điều được chèn vào *.

EDIT:

chi tiết bổ sung cho vector và deque:

Vector:

  • chèn --- Tất cả lặp được không hợp lệ nếu phân bổ lại xảy ra, nếu không hợp lệ của nó .
  • xóa ---- Tất cả các trình vòng lặp sau điểm xóa sẽ không hợp lệ.

deque:

  • chèn --- Tất cả lặp được không hợp lệ.
  • xóa ---- Tất cả các trình vòng lặp nhận được không hợp lệ.
+0

Câu trả lời hay, nó cũng sẽ giúp bạn biết lý do nào có thể khiến một véc tơ phân bổ lại. (chèn một phần tử là một phần tử rõ ràng, nhưng có những phần tử khác không?) – Malabarba

+0

Bất kỳ sửa đổi nào của vectơ (cả việc chèn và loại bỏ) đều được phép tái phân bổ và làm mất hiệu lực vòng lặp; cho dù người ta làm như vậy hay không được thực hiện xác định. Vì vậy, tốt nhất bạn nên giả định rằng việc sửa đổi một vector theo bất kỳ cách nào luôn làm mất hiệu lực tất cả các trình lặp hiện có. – Miral

3

Điều này tùy thuộc vào vùng chứa bạn sử dụng.

Kiểm tra: http://www.sgi.com/tech/stl/
Xem từng tài liệu vùng chứa ở cuối của chúng sẽ là mô tả về các điều kiện mà trình vòng lặp vẫn hợp lệ.

Đối với tiêu chuẩn :: danh sách <> chúng vẫn hợp lệ trong tất cả các điều kiện cho đến khi phần tử mà chúng thực sự tham chiếu bị xóa khỏi vùng chứa (tại thời điểm này chúng không hợp lệ).

+0

cảm ơn thông tin. Tôi đã sử dụng tài liệu của SGI, nhưng tôi đoán tôi đã bỏ qua các ghi chú và không nhận thấy câu trả lời là có. – PypeBros

Các vấn đề liên quan