std::list in C++ з прикладом
⚡ Розумний підсумок
std::list in C++ — це контейнер послідовностей, реалізований у вигляді двозв'язаного списку, що дозволяє швидку вставку та видалення в будь-якій позиції, зберігаючи елементи в несуміжній пам'яті та підтримуючи двонаправлений послідовний доступ замість випадкового доступу.

Що таке std::list?
In C++, std::list посилається на контейнер сховища. std::list дозволяє вставляти та видаляти елементи з будь-якого місця. std::list реалізовано як подвійно зв'язаний список. Це означає, що до даних списку можна отримати доступ двонаправлено та послідовно.
Список стандартної бібліотеки шаблонів не підтримує швидкий довільний доступ, але підтримує послідовний доступ з усіх напрямків.
Ви можете розкидати елементи списку по різних фрагментах пам’яті. Інформація, необхідна для послідовного доступу до даних, зберігається в контейнері. Під час виконання std::list може розширюватися та звужуватися з обох кінців. Внутрішній розподільник автоматично виконує вимоги до сховища.
Ці риси викликають практичне питання: коли насправді варто звернутися до списку?
Навіщо використовувати std::list?
Ось причини використання std::list:
- std::list працює краще порівняно з іншими контейнерами послідовностей, такими як масиви та вектори.
- Вони мають кращу продуктивність у вставлянні, переміщенні та вилученніtracелементи з будь-якого положення.
- std::list також краще працює з алгоритмами, які інтенсивно виконують такі операції.
Зрозумівши причини, наступним кроком є синтаксис оголошення одиниці.
Синтаксис списку
Щоб визначити std::list, нам потрібно імпортувати файл заголовка. Ось синтаксис визначення std::list:
template < class Type, class Alloc =allocator<T> > class list;
Ось опис наведених вище параметрів:
- T – Визначає тип елемента, що міститься. Ви можете замінити T будь-яким типом даних, навіть типами, визначеними користувачем.
- Alloc – Визначає тип об'єкта розподільника пам'яті. За замовчуванням використовується шаблон класу розподільника. Він залежить від значення та використовує просту модель розподілу пам'яті.
Приклад 1
#include <algorithm> #include <iostream> #include <list> int main() { std::list<int> my_list = { 12, 5, 10, 9 }; for (int x : my_list) { std::cout << x << '\n'; } }
вихід:
Ось скріншот коду:
Code Пояснення:
- Включіть файл заголовка алгоритму, щоб використовувати його функції.
- Включіть файл заголовка iostream, щоб використовувати його функції.
- Включіть файл заголовка списку, щоб використовувати його функції.
- Виклик функції main(). Логіку програми слід додати в тіло цієї функції.
- Створіть список із назвою my_list із набором із 4 цілих чисел.
- Використовувати для петлі створити змінну циклу x. Ця змінна буде використовуватися для ітерації по елементах списку.
- Роздрукуйте значення списку на консолі.
- Кінець тіла циклу for.
- Кінець тіла функції main().
C++ Список функцій
Ось типові функції std::list:
| функція | Опис |
|---|---|
| вставити () | Ця функція вставляє новий елемент перед позицією, на яку вказує ітератор. |
| відсунути() | Ця функція додає новий елемент у кінець списку. |
| push_front() | Він додає новий елемент на початку списку. |
| pop_front() | Він видаляє перший елемент списку. |
| розмір () | Ця функція визначає кількість елементів списку. |
| фронт() | Щоб визначити перші пункти списку. |
| назад() | Щоб визначити останній пункт списку. |
| зворотний() | Він перевертає елементи списку. |
| merge () | Він об’єднує два відсортовані списки. |
Конструктори
Ось список Функції надані файл заголовка:
- Конструктор за замовчуванням std::list::list() - створює порожній список із нульовими елементами.
- Конструктор заповнення std::list::list() - створює список із n елементів і присвоює значення нуль (0) кожному елементу.
- Конструктор діапазону std::list::list() - створює список із багатьма елементами в діапазоні від першого до останнього.
- Конструктор копіювання std::list::list() - створює список із копією кожного елемента, що міститься в існуючому списку.
- Конструктор переміщення std::list::list() - створює список з елементами іншого списку за допомогою семантики переміщення.
- Конструктор списку ініціалізатора std::list::list() – створює список з елементами іншого списку за допомогою семантики переміщення.
Приклад 2
#include <iostream> #include <list> using namespace std; int main(void) { list<int> l; list<int> l1 = { 10, 20, 30 }; list<int> l2(l1.begin(), l1.end()); list<int> l3(move(l1)); cout << "Size of list l: " << l.size() << endl; cout << "List l2 contents: " << endl; for (auto it = l2.begin(); it != l2.end(); ++it) cout << *it << endl; cout << "List l3 contents: " << endl; for (auto it = l3.begin(); it != l3.end(); ++it) cout << *it << endl; return 0; }
вихід:
Ось скріншот коду:
Code Пояснення:
- Включіть файл заголовка iostream, щоб використовувати його функції.
- Включіть файл заголовка списку, щоб використовувати його функції.
- Включіть простір імен std у код, щоб використовувати його класи без його виклику.
- Виклик функції main(). Логіку програми слід додати в тіло цієї функції.
- Створіть порожній список з іменем l.
- Створіть список із назвою l1 із набором із 3 цілих чисел.
- Створіть список під назвою l2 з усіма елементами списку під назвою l1 від початку до кінця.
- Створіть список під назвою l3, використовуючи семантику переміщення. Список l3 матиме той самий вміст, що й список l2.
- Надрукуйте розмір списку з назвою l на консолі поряд з іншим текстом.
- Надрукуйте текст на консолі.
- Створіть ітератор з іменем it і використовуйте його для повторення елементів списку з іменем l2.
- Вивести на консоль елементи списку з іменем l2.
- Надрукуйте текст на консолі.
- Створіть ітератор з іменем it і використовуйте його для повторення елементів списку з іменем l3.
- Вивести на консоль елементи списку з іменем l3.
- Після успішного завершення програма повинна повернути значення.
- Кінець тіла функції main().
Властивості контейнерів
Ось список властивостей контейнера:
| властивість | Опис |
|---|---|
| Послідовність | Контейнери послідовності впорядковують свої елементи в строгій лінійній послідовності. Доступ до елементів здійснюється за їхньою позицією в послідовності. |
| Двозв'язний список | Кожен елемент містить інформацію про те, як знайти попередні та наступні елементи. Це забезпечує постійний час для операцій вставки та видалення. |
| Розподільник | Об’єкт розподільника використовується для динамічної зміни розміру сховища. |
Вставлення в список
Існують різні функції, які ми можемо використовувати для вставки значень у список. Давайте продемонструємо це:
Приклад 3
#include <algorithm> #include <iostream> #include <list> int main() { std::list<int> my_list = { 12, 5, 10, 9 }; my_list.push_front(11); my_list.push_back(18); auto it = std::find(my_list.begin(), my_list.end(), 10); if (it != my_list.end()) { my_list.insert(it, 21); } for (int x : my_list) { std::cout << x << '\n'; } }
вихід:
Ось скріншот коду:
Code Пояснення:
- Включіть файл заголовка алгоритму, щоб використовувати його функції.
- Включіть файл заголовка iostream, щоб використовувати його функції.
- Включіть файл заголовка списку, щоб використовувати його функції.
- Виклик функції main(). Логіку програми слід додати в тіло цієї функції.
- Створіть список із назвою my_list із набором із 4 цілих чисел.
- Вставте елемент 11 на початку списку з назвою my_list.
- Вставте елемент 18 у кінець списку з назвою my_list.
- Створіть його ітератор і за допомогою нього знайдіть елемент 10 зі списку my_list.
- Використовуйте оператор if, щоб визначити, чи знайдено вищевказаний елемент чи ні.
- Вставте елемент 21 перед елементом вище, якщо він знайдений.
- Кінець тіла оператора if.
- Використовуйте цикл for, щоб створити змінну циклу x. Ця змінна буде використовуватися для перебору елементів списку.
- Роздрукуйте значення списку на консолі.
- Кінець тіла петлі for.
- Кінець тіла функції main().
Елементи, які входять до списку, можна так само легко видалити.
Видалення зі списку
Ви можете видаляти елементи зі списку. Функція erase() дозволяє видалити елемент або діапазон елементів зі списку.
- Щоб видалити окремий елемент, ви просто передаєте одну цілу позицію. Елемент буде видалено.
- Щоб видалити діапазон, потрібно передати початковий та кінцевий ітератори. Давайте продемонструємо це.
Приклад 4
#include <algorithm> #include <iostream> #include <list> using namespace std; int main() { std::list<int> my_list = { 12, 5, 10, 9 }; cout << "List elements before deletion: "; for (int x : my_list) { std::cout << x << '\n'; } list<int>::iterator i = my_list.begin(); my_list.erase(i); cout << "\nList elements after deletion: "; for (int x : my_list) { std::cout << x << '\n'; } return 0; }
вихід:
Ось скріншот коду:
Code Пояснення:
- Включіть файл заголовка алгоритму, щоб використовувати його функції.
- Включіть файл заголовка iostream, щоб використовувати його функції.
- Включіть файл заголовка списку, щоб використовувати його функції.
- Включіть простір імен std у нашу програму, щоб використовувати його класи без його виклику.
- Виклик функції main(). Логіку програми слід додати в тіло цієї функції.
- Створіть список із назвою my_list із набором із 4 цілих чисел.
- Надрукуйте текст на консолі.
- Використовуйте цикл for, щоб створити змінну циклу x. Ця змінна буде використовуватися для перебору елементів списку.
- Роздрукуйте значення списку на консолі.
- Кінець тіла циклу for.
- Створіть ітератор i, який вказує на перший елемент списку.
- Використовуйте функцію erase(), на яку вказує ітератор i.
- Надрукуйте текст на консолі.
- Використовуйте цикл for, щоб створити змінну циклу x. Ця змінна буде використовуватися для перебору елементів списку.
- Роздрукуйте значення списку на консолі. Це відбувається після видалення.
- Кінець тіла циклу for.
- Після успішного завершення програма повинна повернути значення.
- Кінець тіла функції main().






