Nếu chúng tôi có một map <int, vector<int> >
được di chuyển khi cây màu đỏ đen của bản đồ thay đổi hoặc nó lưu trữ con trỏ đến vector
s hoặc một cái gì đó tương tự và không di chuyển chúng (khác làm việc với bản đồ sẽ không là O (lg n) nữa ví dụ như nếu chúng ta push_back yếu tố để một số vector
s)Phần thứ hai của bản đồ là <..,..> có ổn định không?
Trả lời
Xem cái này: std::map, pointer to map key value, is this possible?
các thứ hai câu trả lời đầu:
Mục 23.1.2 # 8 (kết hợp con yêu cầu tainer):
"Thành viên chèn sẽ không ảnh hưởng đến tính hợp lệ của trình lặp và tham chiếu đến vùng chứa và thành viên xóa sẽ chỉ vô hiệu hóa vòng lặp và tham chiếu đến phần tử đã xóa."
Vì vậy, có lưu trữ con trỏ tới thành viên dữ liệu của phần tử bản đồ được đảm bảo hợp lệ, trừ khi bạn xóa yếu tố.
Vì vậy, nếu tham chiếu được giữ nguyên, dữ liệu không thể được sao chép vào một phần khác của bộ nhớ. Và nếu đúng như vậy, tôi không thấy điểm nào trong việc thực hiện bất kỳ bản sao nào cả ...
Không, các vectơ sẽ không được di chuyển xung quanh. Các thao tác của cây chỉ sắp xếp lại con trỏ giữa các nút. Chúng không di chuyển các nút hoặc nội dung của chúng trong bộ nhớ.
Tôi tin rằng C++ 03 không đảm bảo tính ổn định của dữ liệu trong bộ nhớ và đây sẽ là chi tiết triển khai (và thực sự không phải thứ bạn có thể giả định một cách an toàn mà không kiểm tra).
Lưu ý rằng việc bảo tồn lặp vào bản đồ và vị trí của vector thực tế trong bộ nhớ là điều hoàn toàn khác nhau. Tính hợp lệ của các trình vòng lặp được xác định rõ ràng (cả khi chúng hợp lệ và khi chúng không) trong đặc tả C++, nhưng hành vi bên trong thực tế của cây không phải là.
Điều đó nói rằng, bất kỳ trình biên dịch tốt nào (cho bản phát hành/bật tối ưu hóa) sẽ tối ưu hóa việc triển khai để không thực sự sao chép vectơ khi nó được di chuyển xung quanh cây và triển khai C++ 11 của std::map
sẽ sử dụng ngữ nghĩa di chuyển để đảm bảo hành vi đó.
Điều bạn không thể giả định là các con trỏ chỉ nội bộ được di chuyển.
'std :: map
Nhưng nó cũng bảo tồn tài liệu tham khảo (đồng bằng con trỏ), không chỉ lặp. Điều này cho phép bạn tranh luận về bộ nhớ. Trừ khi có một số ảo hóa địa chỉ bộ nhớ lạ ... – CygnusX1
- 1. Bản đồ <?, ?> có nghĩa là gì trong Java?
- 2. Tạo bản đồ nhiệt bằng phần tử <canvas>?
- 3. Ý nghĩa của trình lặp -> thứ hai là gì?
- 4. Bất kỳ việc triển khai Bản đồ <K1, K2, V>, tức là hai khóa?
- 5. Java: Khai báo một Bản đồ với hai loại generics liên quan Các loại (<T> Bản đồ <Lớp <? Mở rộng ClassA <T>>, Lớp <? Mở rộng ClassB <T> >>)
- 6. AutoMapper: Bản đồ <A,B> có cho <B,A> không?
- 7. Tại sao java.util.Properties thực hiện Bản đồ <Object, Object> và không phải Bản đồ <String, String>
- 8. java.lang.IllegalArgumentException: lập bản đồ Lọc phải chỉ định hoặc là một <url-pattern> hoặc <servlet-name>
- 9. NEST lập bản đồ của Dictionary <string, object>
- 10. NHibernate một-một bản đồ nơi dữ liệu bảng thứ hai có thể là null
- 11. Có phiên bản ngữ nghĩa của <u> không?
- 12. JAX-RS, Bản đồ <String, String> đến JSON mà không có phí trên không?
- 13. Có từ điển <TKey, TValue> theo thứ tự các khóa theo mặc định không?
- 14. Tại sao <$> chỉ hoạt động trên thành viên thứ hai của một cặp?
- 15. C++ bản đồ <string, vector <char>> truy cập
- 16. Java Generics đặt trên Bản đồ <String,? mở rộng Danh sách <String>>
- 17. Phiên bản ổn định cho jasperreports-maven-plugin là gì?
- 18. VS11 ổn định, ổn định?
- 19. Phần tử <figure> chỉ chứa <figcaption> không có hình ảnh?
- 20. đồ <int,int> giá trị mặc định
- 21. Sử dụng thẻ <form:select> với bản đồ
- 22. Bản đồ cửa hàng <Enum, Enum> làm chuỗi
- 23. Spring Framework: Populating một bản đồ <Enum,Object> với util: bản đồ
- 24. Bạn có thể xác định <=> trong Ruby và sau đó có ==,>, <, > = và <= được xác định tự động không?
- 25. Bản đồ JPA <String, String> mapping
- 26. Sự khác biệt giữa "Phiên bản cũ" và "Phiên bản ổn định" là gì?
- 27. Phần tử <hr /> có thẻ đóng không?
- 28. Cách lập bản đồ <c-leader> trong vim?
- 29. Trong HTML5, là phần tử <form> một phần tử phân đoạn, như <section>?
- 30. Đưa vào một bản đồ <String, ?>
Điều này không giải quyết được câu hỏi cốt lõi: Bản đồ 'std :: map' có được phép cho các phần tử _move_ không? –
Nếu một yếu tố đã được di chuyển, một con trỏ/tham chiếu đến nó sẽ bị vô hiệu (tôi đang nói về con trỏ đồng bằng, không phải vòng lặp). Đó là lý do tại sao - không - nó không được phép di chuyển các phần tử. ... tốt, trong lý thuyết một số thực hiện có thể sao chép các đối tượng một nơi nào đó và sau đó di chuyển trở lại vị trí cũ, nhưng đó sẽ là hơi lạ. – CygnusX1
Mặc dù không có yêu cầu nào như vậy được tạo ra từ 'xóa'. –