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';
	}
}

вихід:

std::list

Ось скріншот коду:

std::list

Пояснення коду:

  1. Включіть файл заголовка алгоритму, щоб використовувати його функції.
  2. Включіть файл заголовка iostream, щоб використовувати його функції.
  3. Включіть файл заголовка списку, щоб використовувати його функції.
  4. Виклик функції main(). Логіку програми слід додати в тіло цієї функції.
  5. Створіть список із назвою my_list із набором із 4 цілих чисел.
  6. Використовуйте цикл for, щоб створити змінну циклу x. Ця змінна буде використовуватися для перебору елементів списку.
  7. Роздрукуйте значення списку на консолі.
  8. Кінець корпусу для петлі.
  9. Кінець тіла функції 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;
}

вихід:

Конструктори списку

Ось скріншот коду:

Конструктори списку

Пояснення коду:

  1. Включіть файл заголовка iostream, щоб використовувати його функції.
  2. Включіть файл заголовка списку, щоб використовувати його функції.
  3. Включіть простір імен std у код, щоб використовувати його класи без його виклику.
  4. Виклик функції main(). Логіку програми слід додати в тіло цієї функції.
  5. Створіть порожній список з іменем l.
  6. Створіть список із назвою l1 із набором із 3 цілих чисел.
  7. Створіть список під назвою l2 з усіма елементами списку під назвою l1 від початку до кінця.
  8. Створіть список під назвою l3, використовуючи семантику переміщення. Список l3 матиме той самий вміст, що й список l2.
  9. Надрукуйте розмір списку з назвою l на консолі поряд з іншим текстом.
  10. Надрукуйте текст на консолі.
  11. Створіть ітератор з іменем it і використовуйте його для повторення елементів списку з іменем l2.
  12. Вивести на консоль елементи списку з іменем l2.
  13. Надрукуйте текст на консолі.
  14. Створіть ітератор з іменем it і використовуйте його для повторення елементів списку з іменем l3.
  15. Вивести на консоль елементи списку з іменем l3.
  16. Після успішного завершення програма повинна повернути значення.
  17. Кінець тіла функції 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';
	}
}

вихід:

Вставлення в список

Ось скріншот коду:

Вставлення в список

Пояснення коду:

  1. Включіть файл заголовка алгоритму, щоб використовувати його функції.
  2. Включіть файл заголовка iostream, щоб використовувати його функції.
  3. Включіть файл заголовка списку, щоб використовувати його функції.
  4. Виклик функції main(). Логіку програми слід додати в тіло цієї функції.
  5. Створіть список із назвою my_list із набором із 4 цілих чисел.
  6. Вставте елемент 11 на початку списку з назвою my_list.
  7. Вставте елемент 18 у кінець списку з назвою my_list.
  8. Створіть його ітератор і за допомогою нього знайдіть елемент 10 зі списку my_list.
  9. Використовуйте оператор if, щоб визначити, чи знайдено вищевказаний елемент чи ні.
  10. Вставте елемент 21 перед елементом вище, якщо він знайдений.
  11. Кінець тіла оператора if.
  12. Використовуйте цикл for, щоб створити змінну циклу x. Ця змінна буде використовуватися для перебору елементів списку.
  13. Роздрукуйте значення списку на консолі.
  14. Кінець тіла петлі for.
  15. Кінець тіла функції 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;
}

вихід:

Видалення зі списку

Ось скріншот коду:

Видалення зі списку

Пояснення коду:

  1. Включіть файл заголовка алгоритму, щоб використовувати його функції.
  2. Включіть файл заголовка iostream, щоб використовувати його функції.
  3. Включіть файл заголовка списку, щоб використовувати його функції.
  4. Включіть простір імен std у нашу програму, щоб використовувати його класи без його виклику.
  5. Виклик функції main(). Логіку програми слід додати в тіло цієї функції.
  6. Створіть список із назвою my_list із набором із 4 цілих чисел.
  7. Надрукуйте текст на консолі.
  8. Використовуйте цикл for, щоб створити змінну циклу x. Ця змінна буде використовуватися для перебору елементів списку.
  9. Роздрукуйте значення списку на консолі.
  10. Кінець тіла циклу for.
  11. Створіть ітератор i, який вказує на перший елемент списку.
  12. Використовуйте функцію erase(), на яку вказує ітератор i.
  13. Надрукуйте текст на консолі.
  14. Використовуйте цикл for, щоб створити змінну циклу x. Ця змінна буде використовуватися для перебору елементів списку.
  15. Роздрукуйте значення списку на консолі. Це відбувається після видалення.
  16. Кінець тіла циклу for.
  17. Після успішного завершення програма повинна повернути значення.
  18. Кінець тіла функції main().

Підсумки

  • std::list є контейнером для зберігання.
  • Це дозволяє вставляти та видаляти елементи з будь-якого місця в постійний час.
  • Він реалізований у вигляді подвійної зв'язку
  • Доступ до даних std::list можна отримати двонаправлено та послідовно.
  • std::list не підтримує швидкий довільний доступ. Однак він підтримує послідовний доступ з усіх напрямків.
  • Ви можете розкидати елементи списку std::list по різних фрагментах пам’яті.
  • Під час виконання ви можете зменшувати або розширювати std::list з обох кінців.
  • Щоб вставити елементи в std::list, ми використовуємо функцію insert().
  • Щоб видалити елементи зі списку std::list, ми використовуємо функцію erase().