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, але це було майже напевно, тому що мені потрібні були сильніші гарантії щодо збереження справжності посилань.