std::list в 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() | Он добавляет новый элемент в начало списка. |
поп_фронт() | Он удаляет первый элемент списка. |
размер() | Эта функция определяет количество элементов списка. |
передний() | Определяет первые элементы списка. |
назад() | Чтобы определить последний элемент списка. |
обеспечить регресс() | Он переворачивает элементы списка. |
объединить () | Он объединяет два отсортированных списка. |
Конструкторы
Вот список Функции предоставлено заголовочный файл:
- Конструктор по умолчанию 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 с набором из трех целых чисел.
- Создайте список с именем 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, указывающий на первый элемент списка.
- Используйте функцию стирания(), на которую указывает итератор i.
- Напечатайте текст на консоли.
- Используйте цикл for, чтобы создать переменную цикла x. Эта переменная будет использоваться для перебора элементов списка.
- Распечатайте значения списка на консоли. Это происходит после удаления.
- Конец тела цикла for.
- Программа должна вернуть значение после успешного завершения.
- Конец тела функции main().
Резюме
- std::list — это контейнер для хранения.
- Это позволяет вставлять и удалять элементы из любого места в постоянное время.
- Он реализован как двойная ссылка
- Доступ к данным std::list можно осуществлять двунаправленно и последовательно.
- std::list не поддерживает быстрый произвольный доступ. Однако он поддерживает последовательный доступ со всех направлений.
- Вы можете разбросать элементы списка std::list по разным частям памяти.
- Вы можете сжимать или расширять std::list с обоих концов по мере необходимости во время выполнения.
- Чтобы вставить элементы в std::list, мы используем функцию Insert().
- Чтобы удалить элементы из std::list, мы используем функцию Erase().