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'; } }
Изход:
Ето екранна снимка на кода:
Обяснение на кода:
- Включете заглавния файл на алгоритъма, за да използвате неговите функции.
- Включете заглавния файл на iostream, за да използвате неговите функции.
- Включете заглавния файл на списъка, за да използвате неговите функции.
- Извикайте функцията main(). Логиката на програмата трябва да се добави в тялото на тази функция.
- Създайте списък с име my_list с набор от 4 цели числа.
- Използвайте for цикъл, за да създадете цикълна променлива x. Тази променлива ще се използва за итерация на елементите на списъка.
- Разпечатайте стойностите на списъка на конзолата.
- Краят на тялото на за цикъл.
- Край на тялото на функцията 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; }
Изход:
Ето екранна снимка на кода:
Обяснение на кода:
- Включете заглавния файл на 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'; } }
Изход:
Ето екранна снимка на кода:
Обяснение на кода:
- Включете заглавния файл на алгоритъма, за да използвате неговите функции.
- Включете заглавния файл на 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, който сочи към първия елемент от списъка.
- Използвайте функцията erase(), посочена от итератора i.
- Отпечатайте малко текст на конзолата.
- Използвайте for цикъл, за да създадете цикълна променлива x. Тази променлива ще се използва за итерация на елементите на списъка.
- Разпечатайте стойностите на списъка на конзолата. Това идва след изтриването.
- Край на тялото на for цикъла.
- Програмата трябва да върне стойност при успешно завършване.
- Край на тялото на функцията main().
Oбобщение
- std::list е контейнер за съхранение.
- Позволява вмъкване и изтриване на елементи от всяко място в постоянно време.
- Реализира се като двойна връзка
- Данните std::list могат да бъдат достъпни двупосочно и последователно.
- std::list не поддържа бърз произволен достъп. Той обаче поддържа последователен достъп от всички посоки.
- Можете да разпръснете списъчни елементи на std::list в различни парчета памет.
- Можете да свивате или разширявате std::list от двата края, ако е необходимо по време на изпълнение.
- За да вмъкнем елементи в std::list, използваме функцията insert().
- За да изтрием елементи от std::list, използваме функцията erase().