Nếu chúng ta cần các bộ sưu tập FIFO hoặc LIFO (về cơ bản là push
, pop
và front
/back
) chúng ta nên sử dụng gì trong Rust? Một cái gì đó như std::queue
hoặc std::stack
từ C++.Có hàng đợi và bộ sưu tập ngăn xếp không?
Trả lời
Trước hết, Rust không cung cấp (trong thư viện Chuẩn) bất kỳ thư viện nào có độ trễ đảm bảo cho các yếu tố thêm: Bộ sưu tập có thể phân bổ bộ nhớ khi thêm yếu tố mới và phân bổ bộ nhớ có thể mất nhiều thời gian trong trường hợp xấu nhất.
đó đang được nói, có hai ứng cử viên cho từng trường hợp:
- một chồng có thể được thực hiện hoặc trên đầu trang của
Vec
hoặcLinkedList
(cả tính năngpop_back
vàpush_back
) - một hàng đợi có thể được thực hiện một trong hai trên đầu trang của
VecDeque
hoặcLinkedList
(cả tính năngpop_front
vàpush_back
)
các diff erence giữa Vec*
và LinkedList
là sau này là đơn giản: cho mỗi cuộc gọi đến push_back
phân bổ bộ nhớ được thực hiện. Một mặt, điều này là tuyệt vời bởi vì nó có nghĩa là chi phí của push_back
độc lập với số lượng các phần tử đã có trong bộ sưu tập, mặt khác ... tốt, việc cấp phát bộ nhớ có thể mất nhiều thời gian.
Điều thứ nhất là phức tạp hơn một chút:
- nó có thông tốt hơn, nhờ được nhiều hơn bộ nhớ cache thân thiện
- nó có khả năng bổ sung, đảm bảo không phân bổ
push_back
chừng nào có công suất dư thừa - nó vẫn duy trì khấu hao O (1)
push_back
ngay cả khi không đặt công suất dư thừa trước thời hạn
Nói chung, tôi khuyên bạn nên sử dụng Vec
cho một ngăn xếp và VecDeque
cho một hàng đợi.
Cả VecDeque
và LinkedList
có push
/pop
_ front
/back
.
- 1. Ngăn xếp và Hàng đợi, Tại sao?
- 2. Lớp xếp hàng trong Bộ sưu tập Java ở đâu?
- 3. Ngăn xếp, hàng đợi và danh sách liên kết
- 4. Có cách nào để sử dụng các bộ sưu tập trên ngăn xếp trong Rust không?
- 5. Sắp xếp lại bộ sưu tập C#
- 6. Sắp xếp bộ sưu tập dựa trên một bộ sưu tập khác
- 7. Hợp nhất và Sắp xếp hai Bộ sưu tập Eloquent?
- 8. Sự khác biệt giữa Bộ sưu tập và Vùng chứa
- 9. Thẻ và bộ sưu tập
- 10. Sắp xếp bộ sưu tập trong bộ sưu tập bằng cách sử dụng LINQ
- 11. Sắp xếp Bộ sưu tập Laravel qua Array của ID
- 12. Bộ sưu tập rác
- 13. Magento: Sắp xếp bộ sưu tập sản phẩm
- 14. Bộ sưu tập MongoDB có thể có bên trong bộ sưu tập khác không?
- 15. Bộ sưu tập nhanh nhất trong C# để triển khai hàng đợi ưu tiên là gì?
- 16. Ngăn xếp bằng cách sử dụng API bộ sưu tập trực tuyến Java 8
- 17. Khóa ngăn xếp và xếp hàng miễn phí trong C#
- 18. Có thể tạo Hàng đợi cho bộ HashMap không?
- 19. Github: Hàng đợi xếp hàng và yêu cầu kéo
- 20. WinRT có bộ sưu tập rác không?
- 21. Bộ sưu tập Backbone.js có nhiều loại
- 22. Có một Bộ sưu tập nào thu thập được một bộ đơn đặt hàng không?
- 23. Bộ sưu tập tuyển tập có mảng
- 24. Cách sắp xếp Bộ sưu tập <T>?
- 25. Bộ sưu tập và chủ đề rác
- 26. Sắp xếp một bộ sưu tập của các đối tượng
- 27. Cách sắp xếp bộ sưu tập trong Magento?
- 28. Có bộ sưu tập Threadsafe Observable trong .NET 4 không?
- 29. Làm thế nào tôi có thể sửa đổi một bộ sưu tập hàng đợi trong một vòng lặp?
- 30. Dự báo JPA mùa xuân có Bộ sưu tập không?
Cảm ơn Humm, tôi đã tìm kiếm các từ khóa ma thuật 'FIFO' và' LIFO' và không có gì đáng kể. Có lẽ nó là một vấn đề tài liệu. – Boiethios
Tôi thấy std :: Vec là một lựa chọn tốt cho một chồng, nhưng hiệu quả hơn cho một hàng đợi là gì? – Boiethios
Tùy thuộc vào trường hợp sử dụng của bạn. Tôi đoán rằng 'LinkedList' sẽ dễ dự đoán hơn, nhưng' VecDeque' trung bình hiệu quả hơn theo một số cách, nhưng thực sự bạn phải tự đo nó. –