Để sao chép LinkedHashSet từ JAVA trong C++, tôi nghĩ bạn sẽ cần hai vanilla std::map
(xin lưu ý rằng bạn sẽ nhận được LinkedTreeSet thay vì LinkedHashSet thực thay vào đó sẽ nhận được O (log n) để chèn và xóa) công việc.
- Một giá trị thực tế sử dụng làm thứ tự khóa và chèn (thường là int hoặc long int) làm giá trị.
- Một số khác ngược lại, sử dụng thứ tự chèn làm khóa và giá trị thực tế làm giá trị.
Khi bạn đang đi để chèn, bạn sử dụng std::map::find
trong std::map
đầu tiên để đảm bảo rằng không có đối tượng giống hệt nhau tồn tại trong đó.
- Nếu đã tồn tại, hãy bỏ qua mục mới.
- Nếu không, bạn ánh xạ đối tượng này với thứ tự chèn tăng lên cho cả hai
std::map
Tôi đã đề cập trước đây.
Khi bạn đang đi để lặp qua chuyện này theo lệnh của chèn, bạn lặp qua thứ hai std::map
vì nó sẽ được sắp xếp theo thứ tự chèn (bất cứ thứ gì rơi vào std::map
hoặc std::set
sẽ được sắp xếp tự động).
Khi bạn sắp xóa phần tử khỏi nó, bạn sử dụng std::map::find
để nhận thứ tự chèn. Sử dụng thứ tự chèn này để xóa phần tử khỏi số std::map
thứ hai và xóa đối tượng khỏi đối tượng đầu tiên. Vui lòng lưu ý rằng giải pháp này không hoàn hảo, nếu bạn dự định sử dụng trên cơ sở dài hạn, bạn sẽ cần phải "nhỏ gọn" thứ tự chèn sau một số lần xóa nhất định kể từ khi bạn cuối cùng sẽ chạy ra khỏi thứ tự chèn (2^32 chỉ mục cho unsigned int hoặc 2^64 chỉ mục cho unsigned dài dài int). Để làm điều này, bạn sẽ cần phải đặt tất cả các đối tượng "giá trị" vào một vectơ, xóa tất cả các giá trị từ cả hai bản đồ và sau đó chèn lại các giá trị từ vectơ trở lại vào cả hai bản đồ. Thủ tục này mất thời gian O (nlogn).
Nếu bạn đang sử dụng C++ 11, bạn có thể thay thế std::map
đầu tiên bằng std::unordered_map
để cải thiện hiệu quả, bạn sẽ không thể thay thế hiệu quả thứ hai bằng nó. Lý do là std::unordered map
sử dụng mã băm để lập chỉ mục sao cho chỉ mục không thể được sắp xếp một cách đáng tin cậy trong tình huống này.
Nguồn
2014-08-15 15:10:25
'std :: set' được đặt hàng. Bạn có nghĩa là bạn muốn nó được theo thứ tự bạn đã chèn nó? –
@sftrabbit, Có, tôi muốn nó theo thứ tự chèn. –
Để thực sự bắt chước LinkedHashSet này, bạn nên sử dụng std :: unordered_set + std :: list, thay vì std :: set + std :: vector. –