QVector
в основному є аналогом std::vector
, як можна здогадатися з назви. QList
ближче до boost::ptr_deque
, незважаючи на очевидну асоціацію з std::list
. Він не зберігає об’єкти безпосередньо, а натомість зберігає вказівники на них. Ви отримуєте всі переваги швидкої вставки на обох кінцях, а перерозподіл передбачає перемішування покажчиків замість конструкторів копіювання, але ви втрачаєте просторову локальність фактичного std::deque
або std::vector
, і отримуєте багато розподілу купи. Він дійсно приймає рішення, щоб уникнути розподілу купи для невеликих об’єктів, повернення просторової місцевості, але, наскільки я розумію, це стосується лише речей, менших заint
.
QLinkedList
є аналогом std::list
і має всі його мінуси. Взагалі кажучи, це повинен бути ваш останній вибір контейнера.
Бібліотека QT надає перевагу використанню QList
об'єктів, тому, надаючи їм перевагу у власному коді, іноді можна уникнути непотрібних сум. Додаткове використання купи і випадкове розташування фактичних даних можуть теоретично зашкодити за певних обставин, але часто це непомітно. Тому я б запропонував використовувати, QList
поки профілювання не запропонує змінити на QVector
. Якщо ви очікуєте, що суміжне розподіл буде важливим [читайте: ви взаємодієте з кодом, який очікує T[]
замість a QList<T>
], що також може бути причиною для того, щоб розпочати QVector
зразу.
Якщо ви запитуєте про контейнери загалом і просто використовували документи QT як посилання, то вищевказана інформація менш корисна.
An std::vector
- це масив, розмір якого можна змінити. Всі елементи зберігаються поруч, і ви можете швидко отримати доступ до окремих елементів. Недоліком є те, що вставки ефективні лише з одного кінця. Якщо ви покладете щось посередині або на початку, вам доведеться скопіювати інші предмети, щоб звільнити місце. У нотації великих ой вставка в кінці - O (1), вставка де-небудь ще - O (N), а довільний доступ - O (1).
An std::deque
подібний, але не гарантує, що об'єкти гарантування зберігаються поруч один з одним, і дозволяє вставляти в обидва кінці значення O (1). Це також вимагає виділення менших фрагментів пам'яті за один раз, що іноді може бути важливим. Випадковий доступ - O (1), а вставка посередині - O (N), як і для a vector
. Просторова територія гірша, ніж std::vector
, але предмети, як правило, кластеризовані, тому ви отримуєте певні переваги.
Ан std::list
- це пов’язаний список. Це вимагає найбільших витрат пам'яті з трьох стандартних послідовних контейнерів, але пропонує швидке вставлення в будь-яке місце ... за умови, що ви заздалегідь знаєте, куди потрібно вставити. Він не пропонує випадковий доступ до окремих елементів, тому вам доведеться повторювати в O (N). Але опинившись, фактичним введенням є O (1). Найбільшою перевагою std::list
є те, що ви можете швидко з’єднати їх між собою ... якщо ви перемістите цілий діапазон значень в інше std::list
, вся операція дорівнює O (1). Також набагато важче скасувати посилання у списку, що іноді може бути важливим.
Як загальне правило, я вважаю std::deque
за краще std::vector
, якщо мені не потрібно мати можливість передавати дані в бібліотеку, яка очікує необроблений масив. std::vector
гарантовано суміжний, тому &v[0]
працює для цієї мети. Я не пам’ятаю, коли востаннє використовував a std::list
, але це було майже напевно, тому що мені потрібні були сильніші гарантії щодо збереження справжності посилань.