Std :: set lưu trữ các đối tượng liên tục trong bộ nhớ?


16

std::setlưu trữ các đối tượng trong bộ nhớ tiếp giáp như thế std::vectornào?

Tôi chưa thể tìm thấy điều này trên web, cppreference không đề cập chi tiết về phân bổ bộ nhớ. Nhưng tôi không thể hiểu tại sao nó không thể sử dụng bộ nhớ liền kề, do đó câu hỏi của tôi.


5
Đọc set::insertcác yêu cầu: en.cppreference.com/w/cpp/container/set/insert "... Không có trình lặp hoặc tham chiếu nào bị vô hiệu ...." vì vậy nó không thể phân bổ lại khi cần mở rộng như thế std::vector.
Richard Critten

Hiệu suất: bạn cần đo (tùy thuộc vào chức năng băm của bạn) cho trường hợp sử dụng của bạn, xem: channel9.msdn.com/Events/Build/2014/2-661 từ 45:48
Richard Critten

4
Xem thêm boost :: Flat_set .
Caleth

1
Bạn có nghĩa là 'tiếp giáp' như trong "khi tập hợp được lặp đi lặp lại, các đối tượng được lưu trữ ở các vị trí bộ nhớ liền kề" hoặc như trong "tất cả các đối tượng được lưu trữ trong một khối lớn của bộ nhớ (nhưng theo thứ tự tùy ý)"?
Pablo H

1
Nói chung, khi bạn thấy mình hỏi "là container A giống như container B", câu trả lời là "không", nếu không sẽ chỉ có container A (vì mục đích của việc chứa container B là gì?). Tất nhiên, điều này không áp dụng cho các bộ điều hợp container , nhưng std::setkhông phải là một trong những điều đó, mà là chìa khóa ở đây.
Các cuộc đua nhẹ nhàng trong quỹ đạo

Câu trả lời:


25

Std :: set lưu trữ các đối tượng trong bộ nhớ liền kề như std :: vector?

Không có gì đảm bảo rằng nó làm. Ngoài ra trong thực tế, nó không thể vì các yêu cầu của container. Do đó, không, nó không lưu trữ các đối tượng trong bộ nhớ liền kề.

Tôi không thể hiểu tại sao nó không thể sử dụng bộ nhớ liền kề

Các tham chiếu đến các phần tử của tập hợp phải còn hiệu lực khi chèn vào nó cũng như xóa (ngoại trừ các tham chiếu đến phần tử bị xóa). Yêu cầu này không tương thích với bộ nhớ liền kề.

Theo tôi biết, một cây tìm kiếm cân bằng là cấu trúc dữ liệu duy nhất có thể thực hiện std::set.


Nó có thể khắc không gian cho các nút cây ra khỏi các khối lớn tiếp giáp nhau, trong trường hợp đó là ý nghĩa của OP. (Tuy nhiên, không có quy tắc iterator huỷ bỏ hiệu lực ra insertsao chép tất cả các nút thành một khối lớn mới để hạn chế nó để chỉ một khối, trong trường hợp tại chỗ realloc không hay (điển hình cho C ++) bộ cấp phát không hỗ trợ một realloc như vậy.)
Peter Dây

15

Nó không được loại trừ một cách rõ ràng, mặc dù các ràng buộc nhất định để std::setlàm cho nó không thể sử dụng bộ nhớ liền kề.

Ví dụ, set::insertcó độ phức tạp logarit trong khi vector::insertyêu cầu độ phức tạp tuyến tính để xáo trộn các mục của nó. Cũng set::insertkhông làm mất hiệu lực các vòng lặp. Cả hai yêu cầu không thể được thực hiện với bộ nhớ dự phòng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.