Tôi biết hash_set
không chuẩn và unordered_set
là tiêu chuẩn. Tuy nhiên, tôi tự hỏi, hiệu suất khôn ngoan, sự khác biệt giữa hai là gì? Tại sao chúng tồn tại riêng biệt?std :: hash_set vs std :: unordered_set, chúng có giống nhau không?
Trả lời
Yêu cầu phức tạp cho các đối tượng unordered_
được đặt ra theo tiêu chuẩn C++ về cơ bản không để lại nhiều chỗ cho việc triển khai, mà phải là một số loại bảng băm. Tiêu chuẩn này được viết hoàn toàn nhận thức rằng các cấu trúc dữ liệu đó đã được triển khai bởi hầu hết các nhà cung cấp dưới dạng một phần mở rộng.
Nhà cung cấp trình biên dịch thường sẽ gọi các bộ chứa đó là "bản đồ băm" hoặc "bộ băm", đó là những gì bạn có thể đang đề cập đến (không có tiêu chuẩn là std::hash_set
theo tiêu chuẩn). không gian tên, và tương tự cho các trình biên dịch khác).
Khi tiêu chuẩn mới được viết, tác giả muốn tránh nhầm lẫn với thư viện mở rộng hiện có, vì vậy họ đã đặt tên phản ánh tư duy điển hình của C++: nói nó là gì chứ không phải cách nó được triển khai. Các vùng chứa không có thứ tự là, tốt, không có thứ tự. Điều đó có nghĩa là bạn nhận được ít hơn từ họ so với các container theo thứ tự, nhưng tiện ích này giảm bớt cho bạn truy cập hiệu quả hơn.
Thực hiện khôn ngoan, hash_set, Tăng không theo thứ tự, TR1-không có thứ tự và C++ 11-không có thứ tự sẽ rất giống nhau, nếu không giống nhau. Ví dụ:
Tôi nghĩ rằng không gian tên cho hash_set bạn gọi là __gnu_cxx. – h9uest
Chúng khá giống nhau. Tên tiêu chuẩn (C++ 0x) là unordered_set. hash_set là tên cũ hơn từ boost và những cái khác.
bởi khá nhiều, bạn có nghĩa là chỉ có tên khác? MSVC bao gồm cả hai, đó là lý do tại sao tôi tò mò. – unixman83
MSVC có một hash_set trong một triển khai trước đó. Họ có thể giữ nó trong một thời gian để làm cho nó dễ dàng hơn trên các nhà phát triển đã sử dụng hash_set. MS di chuyển hash_set ra khỏi std và vào một không gian tên stdext. Bạn nên sử dụng unordered_set cho bất kỳ mã mới nào. Thuật toán cụ thể theo hoặc sẽ phụ thuộc vào trình biên dịch. –
Và giao diện của hash_set của MSVC hơi khác với giao diện của unordered_set, trong khi giao diện hash_set của GCC khá giống với unordered_set, nếu tôi nhớ chính xác. –
Ví dụ Visual Studio 2010 có cả hash_xxx
và unordered_xxx
và nếu bạn xem qua các tiêu đề, ít nhất việc triển khai thực hiện giống nhau cho tất cả các lớp đó (cùng một lớp -/"chính sách"). Đối với các trình biên dịch khác, tôi không biết, nhưng do thùng chứa băm thường phải được triển khai như thế nào, tôi đoán sẽ không có nhiều khác biệt, nếu có.
Về câu hỏi "là chúng giống nhau" từ dòng chủ đề: dựa trên kinh nghiệm nâng cấp mã của tôi từ __gnu_cxx :: hash_set thành std :: unordered_set, chúng gần như, nhưng không chính xác, giống nhau.
Sự khác biệt mà tôi gặp phải là lặp qua __gnu_cxx :: hash_set trả về các mục trong thứ xuất hiện là thứ tự chèn ban đầu, trong khi std :: unordered_set thì không. Vì vậy, như tên của nó, ta không thể dựa vào một iterator để trả về các mục theo bất kỳ thứ tự cụ thể nào khi lặp đi lặp lại toàn bộ std :: unordered_set.
- 1. Sử dụng một std :: unordered_set của std :: unique_ptr
- 2. Performance std :: strstr vs std :: string :: tìm
- 3. std :: list vs std :: vector iteration
- 4. std :: size_t vs size_t vs std :: string :: size_type
- 5. Có thể xóa các phần tử khỏi std :: unordered_set thông qua trình lặp vòng lặp không?
- 6. printf vs std :: cout
- 7. std :: string :: length() vs std :: string :: kích thước()
- 8. std :: string vs. char *
- 9. Có điều gì giống như "std :: và" hoặc "std :: hay" không?
- 10. ném mới std :: ngoại lệ vs ném std :: ngoại lệ
- 11. std :: stringstream vs std :: chuỗi để nối nhiều chuỗi
- 12. Buffer Flushing: "\ n" vs std :: endl
- 13. Tại sao chúng ta cần buộc std :: cin và std :: cout?
- 14. C++ 0x std :: shared_ptr vs. boost :: shared_ptr
- 15. Có cách nào để giao nhau/diff một std :: map và std :: set?
- 16. C++ std :: string append vs push_back()
- 17. google :: dense_hash_map vs std :: tr1 :: unordered_map?
- 18. std :: unordered_set <T> :: insert (T &&): là đối số di chuyển nếu nó tồn tại
- 19. std :: back_inserter cho std :: set?
- 20. Relational vs Columnar và Document Databases - không phải là chúng giống nhau không?
- 21. std :: initializer_list không có cbegin()/cend()
- 22. std :: bind to std :: function?
- 23. Tại sao không std :: pair có iterators?
- 24. std :: unordered_set <Foo> là thành viên của lớp Foo
- 25. return std :: string/std :: list from dll
- 26. Có một cú pháp cụ thể để khởi tạo một mảng std :: từ một mảng khác, std :: khác nhau không?
- 27. Ví dụ đơn giản C++ hash_set
- 28. Sự khác nhau giữa std :: set và std :: vector là gì?
- 29. Trình lặp trước cho std :: vector std :: toán tử VS trước +?
- 30. Làm cách nào để có thể tạo std :: vector <std::string> và sau đó sắp xếp chúng?
Chúng tồn tại riêng biệt bởi vì chúng được tạo ra và phần còn lại được tạo thành một phần của tiêu chuẩn dự thảo. Chúng không được tạo ra cùng một lúc. –
@JonathanGrynspan: Tại sao bạn không làm cho câu trả lời đó? Vì nó, bạn biết đấy, trả lời câu hỏi;) –
Cả hai đều sử dụng cùng một thuật toán? – unixman83