std::list in C++ з прикладом
Що таке std::list?
In C++, std::list посилається на контейнер зберігання. std:list дозволяє вставляти та видаляти елементи з будь-якого місця. std::list реалізовано як подвійний список. Це означає, що до даних списку можна отримати двонаправлений і послідовний доступ.
Список стандартної бібліотеки шаблонів не підтримує швидкий довільний доступ, але він підтримує послідовний доступ з усіх боків.
Ви можете розкидати елементи списку по різних фрагментах пам’яті. Інформація, необхідна для послідовного доступу до даних, зберігається в контейнері. Під час виконання std::list може розширюватися та звужуватися з обох кінців. Внутрішній розподільник автоматично виконує вимоги до сховища.
Навіщо використовувати std::list?
Ось причина використання std::List:
- std::list краще порівнювати з іншими контейнерами послідовності, такими як масив і вектор.
- Вони краще вставляють, переміщують і витягають елементи з будь-якого положення.
- 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'; } }
вихід:
Ось скріншот коду:
Пояснення коду:
- Включіть файл заголовка алгоритму, щоб використовувати його функції.
- Включіть файл заголовка iostream, щоб використовувати його функції.
- Включіть файл заголовка списку, щоб використовувати його функції.
- Виклик функції main(). Логіку програми слід додати в тіло цієї функції.
- Створіть список із назвою my_list із набором із 4 цілих чисел.
- Використовуйте цикл for, щоб створити змінну циклу x. Ця змінна буде використовуватися для перебору елементів списку.
- Роздрукуйте значення списку на консолі.
- Кінець корпусу для петлі.
- Кінець тіла функції 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; }
вихід:
Ось скріншот коду:
Пояснення коду:
- Включіть файл заголовка 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'; } }
вихід:
Ось скріншот коду:
Пояснення коду:
- Включіть файл заголовка алгоритму, щоб використовувати його функції.
- Включіть файл заголовка 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; }
вихід:
Ось скріншот коду:
Пояснення коду:
- Включіть файл заголовка алгоритму, щоб використовувати його функції.
- Включіть файл заголовка iostream, щоб використовувати його функції.
- Включіть файл заголовка списку, щоб використовувати його функції.
- Включіть простір імен std у нашу програму, щоб використовувати його класи без його виклику.
- Виклик функції main(). Логіку програми слід додати в тіло цієї функції.
- Створіть список із назвою my_list із набором із 4 цілих чисел.
- Надрукуйте текст на консолі.
- Використовуйте цикл for, щоб створити змінну циклу x. Ця змінна буде використовуватися для перебору елементів списку.
- Роздрукуйте значення списку на консолі.
- Кінець тіла циклу for.
- Створіть ітератор i, який вказує на перший елемент списку.
- Використовуйте функцію erase(), на яку вказує ітератор i.
- Надрукуйте текст на консолі.
- Використовуйте цикл for, щоб створити змінну циклу x. Ця змінна буде використовуватися для перебору елементів списку.
- Роздрукуйте значення списку на консолі. Це відбувається після видалення.
- Кінець тіла циклу for.
- Після успішного завершення програма повинна повернути значення.
- Кінець тіла функції main().
Підсумки
- std::list є контейнером для зберігання.
- Це дозволяє вставляти та видаляти елементи з будь-якого місця в постійний час.
- Він реалізований у вигляді подвійної зв'язку
- Доступ до даних std::list можна отримати двонаправлено та послідовно.
- std::list не підтримує швидкий довільний доступ. Однак він підтримує послідовний доступ з усіх напрямків.
- Ви можете розкидати елементи списку std::list по різних фрагментах пам’яті.
- Під час виконання ви можете зменшувати або розширювати std::list з обох кінців.
- Щоб вставити елементи в std::list, ми використовуємо функцію insert().
- Щоб видалити елементи зі списку std::list, ми використовуємо функцію erase().