2012-07-05 32 views
10

Tôi tự hỏi lý do đằng sau việc thực hiện std::list<>::splice là gì để làm mất hiệu lực các trình vòng lặp tham chiếu đến chuỗi được ghép nối vào vùng chứa mới. Điều này có vẻ phi lý với tôi, đặc biệt là trong tiêu chuẩn của thông số kỹ thuật tiêu chuẩn std::container::swap. Theo tiêu chuẩn ngôn ngữ std::container::swap không làm mất hiệu lực bất kỳ trình lặp nào. Đây là một đặc tả thực tế hợp lý hoàn hảo. Tuy nhiên, tôi muốn nói rằng std::list<>::splice cũng sẽ được hưởng lợi rất nhiều từ hành vi bảo quản vòng lặp.std :: list <> :: splice invalidates iterators. Lý do?

Tôi hiểu rằng có thể có một số cân nhắc học tập hoàn toàn dựa trên khái niệm về khả năng truy cập của trình vòng lặp, v.v. Nhưng đồng thời splice là hoạt động cụ thể, có nghĩa là cung cấp đặc điểm kỹ thuật tùy chỉnh cho nó gây thiệt hại nghiêm trọng về khái niệm cho thiết kế STL nói chung.

Vậy đó là gì? Nó có cấm hay không tuân thủ một số triển khai thực tế của std::list, mà tôi không nhận ra?

+0

bản sao có thể có của [splice() trên std :: list and iterator invalidation] (http://stackoverflow.com/questions/143156/splice-on-stdlist-and-iterator-invalidation) – jwismar

Trả lời

7

Trong C++ 11 splice không làm mất hiệu lực các trình vòng lặp, nhưng làm cho chúng tham chiếu đến các phần tử thích hợp trong vùng chứa *this. Đây là tất cả được mô tả trong 23.3.5.5.

+0

Ồ, OK. Chỉ cần tìm thấy điều đó. Vì vậy, rõ ràng không có lý do chính đáng cho yêu cầu vô hiệu. Câu hỏi của tôi phát sinh chủ yếu sau khi thấy có bao nhiêu vòng và vòng mà Microsoft phải nhảy qua trong việc triển khai STL của họ để cung cấp hỗ trợ "iterator debugging" cho cả 'swap' và' splice'. Cảm ơn câu trả lời. – AnT

+0

@AndreyT "_So, dường như không có lý do chính đáng nào cho yêu cầu vô hiệu._" Không thực sự. Tại một thời điểm nào đó, ủy ban muốn hỗ trợ đầy đủ các bộ cấp phát bộ nhớ _unequal_ và các trình phân bổ này không tương thích, do đó, một số việc sao chép sẽ là cần thiết trong trường hợp rất đặc biệt này. – curiousguy

4

Nếu các thùng chứa đã tùy chỉnh, phân bổ không đồng đều (không tương thích), bạn không thể trao đổi con trỏ, bạn không có lựa chọn nào khác ngoài thực sự sao chép các phần tử xung quanh.

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