std::list в C++ с примером

Что такое std::list?

В C++ std::list относится к контейнеру хранения. Std:list позволяет вставлять и удалять элементы откуда угодно. Std::list реализован как двусвязный список. Это означает, что доступ к данным списка может быть двунаправленным и последовательным.

Список стандартной библиотеки шаблонов не поддерживает быстрый произвольный доступ, но поддерживает последовательный доступ со всех направлений.

Вы можете разбросать элементы списка по разным участкам памяти. Информация, необходимая для последовательного доступа к данным, хранится в контейнере. Std::list может расширяться и сжиматься с обоих концов по мере необходимости во время выполнения. Внутренний распределитель автоматически удовлетворяет требования к хранилищу.

Зачем использовать std::list?

Вот причина использования std::List :

  • Std::list лучше сравнивается с другими контейнерами последовательностей, такими как массив и вектор.
  • Они имеют лучшую производительность при вставке, перемещении и извлечении элементов из любой позиции.
  • Std::list также лучше справляется с algorithms которые выполняют такие operaции интенсивно.

Синтаксис списка

Чтобы определить 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() Он добавляет новый элемент в начало списка.
поп_фронт() Он удаляет первый элемент списка.
размер() Эта функция определяет количество элементов списка.
передний() Определяет первые элементы списка.
назад() Чтобы определить последний элемент списка.
обеспечить регресс() Он переворачивает элементы списка.
объединить () Он объединяет два отсортированных списка.

Конструкторы

Вот список Функции предоставлено заголовочный файл:

  • Конструктор по умолчанию 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 с набором из трех целых чисел.
  7. Создайте список с именем l2 со всеми элементами списка с именем l1 от начала до конца.
  8. Создайте список с именем l3, используя семантику перемещения. Список l3 будет иметь то же содержимое, что и список l2.
  9. Выведите размер списка с именем l на консоли вместе с другим текстом.
  10. Напечатайте текст на консоли.
  11. Создайте итератор с именем it и используйте его для перебора элементов списка с именем l2.
  12. Выведите элементы списка с именем l2 на консоль.
  13. Напечатайте текст на консоли.
  14. Создайте итератор с именем it и используйте его для перебора элементов списка с именем l3.
  15. Выведите элементы списка с именем l3 на консоль.
  16. Программа должна вернуть значение после успешного завершения.
  17. Конец тела функции main().

Свойства контейнера

Вот список свойств контейнера:

Объект Описание
Последовательность Контейнеры последовательностей упорядочивают свои элементы в строгой линейной последовательности. Доступ к элементам осуществляется по их положению в последовательности.
Двусвязный список Каждый элемент содержит информацию о том, как найти предыдущий и следующий элементы. Это обеспечивает постоянное время для вставки и удаления. operaЦИИ.
С поддержкой распределителя Объект-распределитель используется для динамического изменения размера хранилища.

Вставка в список

Существуют различные функции, которые мы можем использовать для вставки значений в список. Давайте продемонстрируем это:

Пример 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. Используйте функцию стирания(), на которую указывает итератор 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().