QVector
chủ yếu là tương tự std::vector
, như bạn có thể đoán từ tên. QList
là gần hơn boost::ptr_deque
, mặc dù liên kết rõ ràng với std::list
. Nó không lưu trữ trực tiếp các đối tượng mà thay vào đó, nó lưu trữ các con trỏ tới chúng. Bạn đạt được tất cả những lợi ích của việc chèn nhanh ở cả hai đầu và việc phân bổ lại liên quan đến việc xáo trộn con trỏ thay vì sao chép các hàm tạo, nhưng làm mất vị trí không gian của một thực tế std::deque
hoặc std::vector
và đạt được nhiều phân bổ đống. Nó thực sự có một số quyết định để tránh phân bổ đống cho các đối tượng nhỏ, lấy lại vị trí không gian, nhưng từ những gì tôi hiểu, nó chỉ áp dụng cho những thứ nhỏ hơn an int
.
QLinkedList
tương tự std::list
và có tất cả các mặt trái của nó. Nói chung, đây sẽ là lựa chọn cuối cùng của bạn về một container.
Thư viện QT rất ủng hộ việc sử dụng các QList
đối tượng, vì vậy việc ưu tiên chúng trong mã của riêng bạn đôi khi có thể tránh được một số tẻ nhạt không cần thiết. Việc sử dụng thêm đống và định vị ngẫu nhiên của dữ liệu thực tế về mặt lý thuyết có thể gây hại trong một số trường hợp, nhưng đôi khi là không đáng chú ý. Vì vậy, tôi sẽ đề nghị sử dụng QList
cho đến khi cấu hình gợi ý thay đổi thành a QVector
. Nếu bạn mong đợi phân bổ liền kề là quan trọng [đọc: bạn đang giao tiếp với mã mong đợi một T[]
thay vì a QList<T>
] thì đó cũng có thể là một lý do để bắt đầu QVector
ngay từ đầu.
Nếu bạn đang hỏi về container nói chung và chỉ sử dụng các tài liệu QT để tham khảo, thì thông tin trên ít hữu ích.
An std::vector
là một mảng mà bạn có thể thay đổi kích thước. Tất cả các phần tử được lưu trữ bên cạnh nhau và bạn có thể truy cập các phần tử riêng lẻ một cách nhanh chóng. Nhược điểm là các chèn chỉ hiệu quả ở một đầu. Nếu bạn đặt thứ gì đó ở giữa, hoặc ở đầu, bạn phải sao chép những đồ vật khác để có chỗ. Trong ký hiệu big-oh, phần chèn ở cuối là O (1), phần chèn ở bất kỳ nơi nào khác là O (N) và truy cập ngẫu nhiên là O (1).
An std::deque
tương tự, nhưng không lưu trữ các đối tượng guarentee cạnh nhau và cho phép chèn ở cả hai đầu là O (1). Nó cũng yêu cầu phân bổ các phần bộ nhớ nhỏ hơn tại một thời điểm, điều này đôi khi có thể quan trọng. Truy cập ngẫu nhiên là O (1) và nội tiếp ở giữa là O (N), tương tự như đối với a vector
. Địa phương không gian kém hơn std::vector
, nhưng các đối tượng có xu hướng được tập hợp lại để bạn đạt được một số lợi ích.
An std::list
là một danh sách liên kết. Nó yêu cầu nhiều bộ nhớ nhất trong ba vùng chứa tuần tự tiêu chuẩn, nhưng cung cấp khả năng chèn nhanh ở mọi nơi ... miễn là bạn biết trước nơi bạn cần chèn. Nó không cung cấp quyền truy cập ngẫu nhiên vào các phần tử riêng lẻ, vì vậy bạn phải lặp lại trong O (N). Nhưng khi ở đó, phần chèn thực tế là O (1). Lợi ích lớn nhất std::list
là bạn có thể nối chúng với nhau một cách nhanh chóng ... nếu bạn di chuyển toàn bộ phạm vi giá trị sang một giá trị khác std::list
, toàn bộ hoạt động là O (1). Việc vô hiệu hóa các tham chiếu trong danh sách cũng khó hơn nhiều, điều này đôi khi có thể quan trọng.
Theo nguyên tắc chung, tôi thích std::deque
làm như vậy std::vector
, trừ khi tôi cần có thể chuyển dữ liệu tới một thư viện mong đợi một mảng thô. std::vector
được đảm bảo liền kề, vì vậy &v[0]
hoạt động cho mục đích này. Tôi không nhớ lần cuối cùng tôi sử dụng a std::list
, nhưng gần như chắc chắn là do tôi cần người có thẩm quyền mạnh hơn về các tham chiếu vẫn còn giá trị.