std::list in C++ с Пример
⚡ Умно обобщение
std::list in C++ е контейнер за последователности, реализиран като двойно свързан списък, позволяващ бързо вмъкване и изтриване на всяка позиция, като същевременно съхранява елементи в несвързана памет и поддържа двупосочен последователен достъп вместо произволен достъп.

Какво е std::list?
In C++, std::list се отнася до контейнер за съхранение. std::list ви позволява да вмъквате и премахвате елементи от всяко място. std::list е реализиран като двойно свързан списък. Това означава, че до данните от списъка може да се осъществява достъп двупосочно и последователно.
Списъкът със стандартни библиотеки с шаблони не поддържа бърз произволен достъп, но поддържа последователен достъп от всички посоки.
Можете да разпръснете елементи от списъка в различни части от паметта. Информацията, необходима за последователен достъп до данни, се съхранява в контейнер. std::list може да се разширява и свива от двата края, ако е необходимо по време на изпълнение. Вътрешен разпределител автоматично изпълнява изискванията за съхранение.
Тези черти повдигат практичен въпрос: кога всъщност трябва да посегнете към списък?
Защо да използвате std::list?
Ето са причините за използването на std::list:
- std::list се справя по-добре в сравнение с други контейнери за последователности, като например array и vector.
- Те имат по-добра производителност при вмъкване, преместване и изважданеtracзахващане на елементи от всяка позиция.
- 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'; } }
Изход:
Ето екранна снимка на кода:
Code Обяснение:
- Включете заглавния файл на алгоритъма, за да използвате неговите функции.
- Включете заглавния файл на iostream, за да използвате неговите функции.
- Включете заглавния файл на списъка, за да използвате неговите функции.
- Извикайте функцията main(). Логиката на програмата трябва да се добави в тялото на тази функция.
- Създайте списък с име my_list с набор от 4 цели числа.
- Употреба за цикъл за да се създаде променлива x за цикъл. Тази променлива ще се използва за итерация през елементите на списъка.
- Разпечатайте стойностите на списъка на конзолата.
- Край на тялото на for цикъла.
- Край на тялото на функцията main().
C++ Функции за списък
Ето често срещаните функции std::list:
| функция | Descriptйон |
|---|---|
| вмъкване () | Тази функция вмъква нов елемент преди позицията, която сочи итераторът. |
| push_back() | Тази функция добавя нов елемент в края на списъка. |
| push_front() | Той добавя нов елемент в началото на списъка. |
| pop_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; }
Изход:
Ето екранна снимка на кода:
Code Обяснение:
- Включете заглавния файл на iostream, за да използвате неговите функции.
- Включете заглавния файл на списъка, за да използвате неговите функции.
- Включете пространството от имена std в кода, за да използвате неговите класове, без да го извиквате.
- Извикайте функцията main(). Логиката на програмата трябва да се добави в тялото на тази функция.
- Създайте празен списък с име l.
- Създайте списък с име l1 с набор от 3 цели числа.
- Създайте списък с име l2 с всички елементи в списъка с име l1, от началото до края.
- Създайте списък с име l3, като използвате семантика на преместване. Списъкът l3 ще има същото съдържание като списъка l2.
- Отпечатайте размера на списъка с име l на конзолата заедно с друг текст.
- Отпечатайте малко текст на конзолата.
- Създайте итератор, наименувайте го и го използвайте, за да обхождате елементите на списъка с име l2.
- Отпечатайте елементите от списъка с име l2 на конзолата.
- Отпечатайте малко текст на конзолата.
- Създайте итератор, наименувайте го и го използвайте, за да обхождате елементите на списъка с име l3.
- Отпечатайте елементите от списъка с име l3 на конзолата.
- Програмата трябва да върне стойност при успешно завършване.
- Край на тялото на функцията main().
Съдържание на контейнера
Ето списъка със свойствата на контейнера:
| Имот | Descriptйон |
|---|---|
| Последователност | Контейнерите за последователности подреждат своите елементи в строга линейна последователност. Елементите са достъпни чрез тяхната позиция в последователността. |
| Двойно свързан списък | Всеки елемент има информация как да намерите предишни и следващи елементи. Това позволява постоянно време за операции по вмъкване и изтриване. |
| Разпределител наясно | Обект за разпределение се използва за динамично модифициране на размера на паметта. |
Вмъкване в списък
Има различни функции, които можем да използваме, за да вмъкваме стойности в списък. Нека демонстрираме това:
Пример 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'; } }
Изход:
Ето екранна снимка на кода:
Code Обяснение:
- Включете заглавния файл на алгоритъма, за да използвате неговите функции.
- Включете заглавния файл на 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; }
Изход:
Ето екранна снимка на кода:
Code Обяснение:
- Включете заглавния файл на алгоритъма, за да използвате неговите функции.
- Включете заглавния файл на iostream, за да използвате неговите функции.
- Включете заглавния файл на списъка, за да използвате неговите функции.
- Включете пространството от имена std в нашата програма, за да използвате неговите класове, без да го извиквате.
- Извикайте функцията main(). Логиката на програмата трябва да се добави в тялото на тази функция.
- Създайте списък с име my_list с набор от 4 цели числа.
- Отпечатайте малко текст на конзолата.
- Използвайте for цикъл, за да създадете цикълна променлива x. Тази променлива ще се използва за итерация на елементите на списъка.
- Разпечатайте стойностите на списъка на конзолата.
- Край на тялото на for цикъла.
- Създайте итератор i, който сочи към първия елемент от списъка.
- Използвайте функцията erase(), посочена от итератора i.
- Отпечатайте малко текст на конзолата.
- Използвайте for цикъл, за да създадете цикълна променлива x. Тази променлива ще се използва за итерация на елементите на списъка.
- Разпечатайте стойностите на списъка на конзолата. Това идва след изтриването.
- Край на тялото на for цикъла.
- Програмата трябва да върне стойност при успешно завършване.
- Край на тялото на функцията main().






