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

⚡ Умное резюме

std::list в C++ is a sequence container implemented as a doubly linked list, enabling fast insertion and deletion at any position while storing elements in non-contiguous memory and supporting bidirectional sequential access instead of random access.

  • 🔗 Doubly linked list: Each element keeps links to its previous and next node, so std::list data lives in non-contiguous memory.
  • Fast insert and delete: Adding or removing an element at a known position is constant time, unlike a vector that shifts elements.
  • ???? No random access: Elements are reached by sequential traversal from either end, so indexing such as list[3] is unavailable.
  • 🧩 Конструкторы: Default, fill, range, copy, move, and initializer-list constructors build a std::list in different ways.
  • 🇧🇷 Member functions: push_front(), push_back(), insert(), erase(), size(), reverse(), and merge() manage the list contents.
  • 🤖 Помощь ИИ: GitHub Copilot and similar assistants scaffold std::list declarations, iterators, and insert or erase logic from a short comment.

std::list в C++

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

In C++, the std::list refers to a storage container. The std::list allows you to insert and remove items from anywhere. The std::list is implemented as a doubly-linked list. This means list data can be accessed bi-directionally and sequentially.

The Standard Template Library list does not support fast random access, but it supports sequential access from all directions.

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

These traits raise a practical question: when should you actually reach for a list?

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

Here are the reasons for using std::list:

  • The std::list does better compared to other sequence containers like array and vector.
  • Они демонстрируют лучшие показатели при вставке, перемещении и извлечении.tracЭлементы, расположенные в любом месте.
  • Std::list также лучше справляется с алгоритмами, которые интенсивно выполняют такие операции.

With the reasons clear, the next step is the syntax that declares one.

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

Чтобы определить std::list, нам нужно импортировать заголовочный файл. Вот синтаксис определения std::list:

template < class Type, class Alloc =allocator<T> > class list;

Вот описание вышеуказанных параметров:

  • T – Defines the type of element contained. You can substitute T by any data type, even user-defined types.
  • Alloc – Defines the type of the allocator object. This uses the allocator class template by default. It is value-dependent and uses a simple memory allocation model.

Пример 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';
	}
}

Выход:

Output of the std::list creation and iteration example

Вот скриншот кода:

C++ code creating a std::list and printing it with a for loop

Code Объяснение:

  1. Включите заголовочный файл алгоритма, чтобы использовать его функции.
  2. Включите заголовочный файл iostream, чтобы использовать его функции.
  3. Включите файл заголовка списка, чтобы использовать его функции.
  4. Вызовите функцию main(). Логику программы следует добавить в тело этой функции.
  5. Создайте список с именем my_list с набором из 4 целых чисел.
  6. Использовать для цикла to create a loop variable x. This variable will be used to iterate over the list elements.
  7. Распечатайте значения списка на консоли.
  8. Конец тела цикла for.
  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;
}

Выход:

Output of the std::list constructors example

Вот скриншот кода:

C++ code demonstrating std::list default, range and move constructors

Code Объяснение:

  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().

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

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

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

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

There are different functions that we can use to insert values into a list. Let us demonstrate this:

Пример 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';
	}
}

Выход:

Output after inserting elements into a std::list

Вот скриншот кода:

C++ code using push_front, push_back and insert on a std::list

Code Объяснение:

  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().

Elements that go into a list can just as easily be taken out.

Удаление из списка

It is possible to delete items from a list. The erase() function allows you to delete an item or a range of items from a list.

  • Чтобы удалить один элемент, вы просто передаете одну целочисленную позицию. Элемент будет удален.
  • To delete a range, you pass the starting and the ending iterators. Let us demonstrate this.

Пример 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;
}

Выход:

Output after deleting an element from a std::list

Вот скриншот кода:

C++ code using the erase function on a std::list

Code Объяснение:

  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().

Часто задаваемые вопросы (FAQ)

std::vector stores elements in contiguous memory with O(1) random access, while std::list is a doubly linked list giving O(1) insertion or deletion anywhere. Choose vector for indexing, and list for frequent middle insertions.

No. std::list has no random access operator, so list[2] does not compile. You reach an element by iterating from begin() or end() one node at a time, which costs linear O(n) time for a deep position.

std::list is a doubly linked list that traverses both directions and supports push_back. std::forward_list is a singly linked list that moves only forward, uses less memory per node, and provides no size() or reverse iterators.

Call the member function my_list.sort(), which runs in about N log N and keeps equal elements stable. The std::sort algorithm will not work because it needs random access iterators. Pass std::greater to sort() for descending order.

Inserting or deleting a node is constant O(1) time once you hold an iterator to the position, because only neighboring pointers change. Finding that position first by traversal still costs O(n) time.

Yes. A std::list is not a set, so it stores repeated values freely. Every push_back, push_front, or insert adds a new node regardless of existing contents. Use std::set when you need to reject duplicate elements.

Да. Второй пилот GitHub writes std::list declarations, iterator loops, and insert or erase calls from a short comment or function name. It often suggests std::vector when contiguous storage suits the task better.

AI coding assistants autocomplete STL container code, flag wrong iterator usage, convert a std::list to a std::vector, and explain complexity trade-offs. They speed up learning the STL, though every suggestion still needs review.

Подведем итог этой публикации следующим образом: