vectors stl
Роля на векторите в STL с примери.
Досега в тази серия C ++ видяхме статични масиви, които имат фиксиран размер.
Ако в средата на програмата трябва да съхраним повече елементи в масива, тогава това става невъзможно и със сигурност ще получим изключение ‘out_of_bound’, в момента, в който се опитаме да съхраним елементи извън границите на масива.
Едно решение за това е масивът да бъде деклариран с максимален капацитет, така че да не открием проблем при съхраняването на повече елементи по време на изпълнение. Но това споразумение има сериозен недостатък, тъй като ние губим твърде много памет.
=> Проверете тук пълната серия за обучение на C ++.
Отговорът на всички тези проблеми е използването на динамичен масив, който ще се разширява сам, когато възникне необходимост. STL предоставя този динамичен масив под формата на векторен контейнер.
Какво ще научите:
- Как определяме векторите?
- Деклариране на вектор в C ++ с std :: Vector Class
- Инициализирайте Vector
- Vector Iterator
- Векторни функции
- Капацитет на вектора
- Векторни модификатори
- 2D вектор
- Пример за вектор
- Заключение
- Препоръчително четене
Как определяме векторите?
Векторите са контейнери за динамичен масив, които автоматично го преоразмеряват, когато елементи се вмъкват или изтриват. Съхранението на вектор се обработва от самия контейнер за вектори.
Елементите във вектора се съхраняват на съседни места. Подобно на масивите, векторните елементи също могат да бъдат обхождани и достъпни с помощта на итератори.
Деклариране на вектор в C ++ с std :: Vector Class
В векторен клас на STL std :: вектор “Се дефинира под заглавката. По този начин, за да използваме векторен контейнер, трябва да включим този заглавие в нашата програма, както е показано по-долу:
#include
Можем да декларираме празен вектор, както е показано по-долу:
std::vector myvec;
Горният ред на кода ще създаде вектор с елементите от тип integer. В памет това ще бъде изложено като myvec.
Инициализирайте Vector
Можем да инициализираме вектор със стойност в момента на декларирането му.
най-лесният начин да конвертирате YouTube в mp3
Това се прави по следния начин:
#include int main() { std::vector myvec = {1, 1, 2, 3, 5}; }
В горния код декларираме вектор от тип int с име myvec, съдържащ първите пет елемента от последователността на Фибоначи.
Оформлението на паметта на този вектор ще бъде както по-долу:
Vector Iterator
Както вече споменахме, ние използваме итератори, за да преминем през вектора последователно.
Векторите поддържат следните итераторски функции за преминаване през елементите:
- begin () - Връща итератор, посочен към първия елемент на векторния контейнер.
- край() - Връща итератор, сочещ към елемента, който следва последния елемент във вектора.
- rbegin () - Връща обратен итератор, сочещ към последния елемент във векторния контейнер.
- render () - Връща обратен итератор, сочещ към първия елемент на векторния контейнер.
- cbegin () - Връща постоянен итератор, сочещ към първия елемент във векторния контейнер.
- няколко() - Връща постоянен итератор, сочещ към елемента, следващ последния елемент на векторния контейнер.
- crbegin () - Връща итератор с обратна константа, сочещ към последния елемент във векторния контейнер.
- crend () - Връща итератор с обратна константа, сочещ към първия елемент във векторния контейнер.
Да видим пример, който ще демонстрира тези итераторски функции.Останалите функции могат да се използват по подобен начин.
#include #include using namespace std; int main() { vector v1; for (int i = 1; i <= 5; i++) v1.push_back(i+1); cout << 'Output of Vector with begin and end: '; for (auto i = v1.begin(); i != v1.end(); ++i) cout << *i << ' '; cout << '
Output of Vector with rbegin and rend: '; for (auto itr = v1.rbegin(); itr != v1.rend(); ++itr) cout << *itr << ' '; cout << '
Output Vector of with cbegin and cend: '; for (auto itc = v1.cbegin(); itc != v1.cend(); ++itc) cout << *itc << ' '; cout << '
Output Vector of with crbegin and crend : '; for (auto icr = v1.crbegin(); icr != v1.crend(); ++icr) cout << *icr << ' '; return 0; }
Изход:
Изход на вектор с начало и край: 2 3 4 5 6
Изход на Vector с rbegin и rend: 6 5 4 3 2
Изходен вектор на с cbegin и cend: 2 3 4 5 6
Изходен вектор на с crbegin и crend: 6 5 4 3 2
По този начин в този код декларираме вектор и вмъкваме стойности в него с помощта на функцията push_back. След това показваме векторите, използвайки всяка от функциите на итератор, които описахме по-горе. Както виждате от изхода, в зависимост от използваните функции на итератора, редът, в който се показва векторът, се променя.
Векторни функции
Сортиране на вектор
Можем да използваме STL алгоритми, които вече сме виждали на вектора.
Даден по-долу е примерът за използване на „Сортиране“ върху вектора.
#include #include #include using namespace std; int main() { vector myvec = {10,50,30,20,60,40}; cout<<'Original Vector'< Изход:
Оригинален вектор
10 50 30 20 60 40
Сортиран вектор
10 20 30 40 50 60
В горния пример ние инициализирахме вектор и след това приложихме алгоритъм за сортиране, за да сортираме вектора.
Печат на елементи на вектор
Векторите могат да бъдат отпечатани с помощта на итератор и поток „cout“. Можем да използваме итератор, за да преминем през всеки от векторните елементи и да ги отпечатаме с cout.
Следващият пример показва това:
#include #include using namespace std; int main() { vector v1; for (int i = 1; i <= 5; i++) v1.push_back(i+2); cout << 'Output of Vector with begin and end: '; for (auto i = v1.begin(); i != v1.end(); ++i) cout << *i << ' '; }
Изход:
Изход на вектор с начало и край: 3 4 5 6 7
Капацитет на вектора
Има различни функции, които въздействат върху векторите, за да определят неговия размер, максимален размер и т.н.
Ние изброяваме функциите по-долу:
(i) Размер на вектора
Функцията size () връща броя на елементите във векторния контейнер. Това е вградената функция на клас std :: vector и може да се използва директно за намиране на размера на вектора.
sql въпроси за интервю с отговори pdf
Нека видим Пример за вектор, използващ функцията size ():
#include #include using namespace std; int main() { vector myvec = {1, 1, 2, 3, 5, 8}; cout << 'Vector Size : ' << myvec.size(); return 0; }
Изход:
Размер на вектора: 6
В горната програма дефинирахме вектор myvec, състоящ се от шест елемента. След това извикваме функцията size () на myvec и тя показва правилния размер.
(ii) Преоразмеряване на вектор
Също така можем да преоразмерим вектор до желания размер, така че да може да побере ‘n’ брой елементи. Това се постига чрез функцията ‘resize ()’ на клас std :: vector. Функцията за преоразмеряване взема размера на вектора като параметър и след това преоразмерява векторния контейнер до зададения размер.
Нека разберем това с помощта на Пример.
#include #include using namespace std; int main() { vector myvec = {1, 1, 2, 3, 5, 8}; cout << '
Vector elements are: '; for (auto it = myvec.begin(); it != myvec.end(); it++) cout << *it << ' '; myvec.resize(4); cout << '
Vector Size after resize: ' << myvec.size(); cout << '
Vector elements after resizing are: '; for (auto it = myvec.begin(); it != myvec.end(); it++) cout << *it << ' '; return 0; }
Изход:
Векторните елементи са: 1 1 2 3 5 8
Размер на вектора след преоразмеряване: 4
Векторните елементи след преоразмеряване са: 1 1 2 3
В горната програма първоначално дефинираме вектор myvec с размер 6. След това извикваме функцията за преоразмеряване на този вектор с размер = 4. Това означава, че сега искаме да преоразмерим нашия вектор до размер 4.
След извикване на функцията за преоразмеряване отпечатваме вектора отново. Виждаме, че когато преоразмеряваме вектора до размер 4, останалите елементи се изхвърлят и се показват само 4-те елемента на вектора.
Освен функциите за размер и преоразмеряване, векторният клас поддържа и още някои функции, които ни позволяват да манипулираме капацитета на вектора. Те са:
- max_size (): Връща максимален размер, т.е.максималният брой елементи, които векторът може да съдържа.
- капацитет(): Връща размера на разпределеното в момента място за съхранение. Това се връща по отношение на броя на елементите.
- празен (): Проверява дали контейнерът е празен.
- смали до пасване(): Свива капацитета на вектора, за да отговаря на размера и изхвърля всички останали елементи.
- резерв (): Запазва капацитета на вектора да съдържа n елемента.
Векторни модификатори
Модификаторите са операции или функции, които могат да се използват за модифициране на съдържанието на векторния контейнер. Ще видим някои от основните функции, които се използват като модификатори.
Присвояване на нови стойности на вектор
Една от функциите на модификаторите, предоставени от std :: vector, е функцията за присвояване. Функцията Assign присвоява нови стойности на вектор, като замества старите.
Това е показано в следващия пример.
#include #include using namespace std; int main() { // Assign vector vector myvec; // assign value 10 5 times myvec.assign(5, 10); cout << 'The vector elements: '; for (int i = 0; i < myvec.size(); i++) cout << myvec[i] << ' '; }
Изход:
Елементите на вектора: 10 10 10 10 10
В горния код декларираме вектор от тип int. След това извикваме да присвоим функция с параметри 5, 10. Това означава, че възнамеряваме да присвоим елемент 10 на вектора 5 пъти. Когато показваме вектора, виждаме, че векторът има 5 елемента, всички със стойност 5.
Изтриване на вектор
Следващата функция, предоставена от std :: vector за модифициране на вектор, е функцията ‘изтриване’. Функцията за изтриване премахва елементите от посочения диапазон или позиция от вектора.
Нека видим Пример за функцията Изтриване.
#include #include using namespace std; int main() { // Initialize vector vector myvec = {1,1,2,3,5}; cout << '
Vector elements:'; for (int i = 0; i < myvec.size(); i++) cout << myvec[i] << ' '; // remove the first element myvec.erase(myvec.begin()); cout<<'
Vector size after erase: '< Изход:
Векторни елементи: 1 1 2 3 5
Размер на вектора след изтриване: 4
Вектор след операция за изтриване: 1 2 3 5
Както е показано в горния изход за функция за преоразмеряване, ние определяме обхвата или позицията на елемента, който трябва да бъде изтрит или премахнат. В горния пример посочихме позицията, сочеща към първия елемент във вектора.
Вмъкване на елементи във вектора
Класът вектор std :: vector предоставя още една функция за вмъкване на стойности във вектора. Функцията Insert ни позволява да вмъкваме елементи във вектора преди определената позиция.
Това ще стане ясно със следния пример.
#include #include using namespace std; int main() { // Assign vector vector myvec = {2,3,4}; cout << '
Initial vector: '; for (int i = 0; i < myvec.size(); i++) cout << myvec[i] << ' '; // inserts 20 at the beginning, 30 after that myvec.insert(myvec.begin(), 20); myvec.insert(myvec.begin()+1,30); cout << '
New vector after insert: '; for (int i = 0; i < myvec.size(); i++) cout << myvec[i] << ' '; }
Изход:
Начален вектор: 2 3 4
Нов вектор след вмъкване: 20 30 2 3 4
Горната програма първоначално декларира вектор с 3 елемента. След това извикваме функцията за вмъкване два пъти, за да вмъкнем стойности 20 и 30 съответно на първо и второ място във вектора. След това показваме променения вектор.
Размяна на векторно съдържание
Класът вектор също ни предоставя възможността да разменяме или обменяме съдържание на един вектор с този на друг вектор от същия тип и размер. Това се постига чрез векторна вградена функция ‘суап’.
Обмислете следната част от кода.
#include #include using namespace std; int main() { // swap operation vector v1, v2; v1.push_back(1); v1.push_back(3); v2.push_back(5); v2.push_back(7); cout << '
Vector 1: '; for (int i = 0; i < v1.size(); i++) cout << v1[i] << ' '; cout << '
Vector 2: '; for (int i = 0; i < v2.size(); i++) cout << v2[i] << ' '; // Swaps v1 and v2 v1.swap(v2); cout << '
After Swap
Vector 1: '; for (int i = 0; i < v1.size(); i++) cout << v1[i] << ' '; cout << '
Vector 2: '; for (int i = 0; i < v2.size(); i++) cout << v2[i] << ' '; }
Изход:
Вектор 1: 1 3
Вектор 2: 5 7
След суап
Вектор 1: 5 7
Вектор 2: 1 3
Горният код показва съдържанието на два вектора преди и след размяна.
Изчистване на стойности във вектора
За разлика от премахването на един или повече елементи от вектора с помощта на функцията за изтриване, ние имаме друга функция „Изчистване“, която ни позволява да премахнем всички елементи в векторния контейнер.
В програмата по-долу демонстрираме ясна функция на векторния контейнер.
#include #include using namespace std; int main() { // swap operation vector v1; v1.push_back(1); v1.push_back(3); v1.push_back(5); v1.push_back(7); cout<<'
Size of vector v1: '< Изход:
Размер на вектора v1: 4
Вектор 1: 1 3 5 7
Размер на вектора v1 след повикване за изчистване на функцията: 0
Тук първо декларираме вектор и след това натискаме елементи в него. След като извикаме функцията clear (), виждаме, че всички елементи във вектора се премахват наведнъж.
в (поз)
Тази функция връща препратката към елемента в позиция ‘pos’ във вектора.
Това е една от функциите, която се използва за достъп до векторния елемент.
Пример е даден по-долу:
#include #include using namespace std; int main() { // Assign vector vector myvec = {1,1,2,3,5,8}; cout<<'
Element at position 3 : '< Изход:
Елемент в позиция 3: 3
Както е показано в примера, функцията ‘at’ се използва за достъп до елемента във вектора в определената позиция.
Отпред
Функцията ‘front’ връща препратката към първия елемент на вектора. Това е още една функция, която използваме за достъп до елементите на векторния контейнер.
Следващият пример показва използването на функцията ‘front’.
#include #include #include using namespace std; int main() { // Initialize vector vector myvec = {1,1,2,3,5,8}; cout<<'
Input vector: '; for(auto it=myvec.begin();it Изход:
Входен вектор: 1 1 2 3 5 8
Елемент в предната част на вектора: 1
обратно
Подобно на функцията ‘front’, функцията back се използва за достъп до последния елемент на векторния контейнер. Функцията ‘back’ връща препратка към последния елемент във векторния контейнер.
Следващият пример показва използването на функцията „назад“.
#include #include #include using namespace std; int main() { // Initialize vector vector myvec = {1,1,2,3,5,8}; cout<<'
Input vector: '; for(auto it=myvec.begin();it Изход:
Входен вектор: 1 1 2 3 5 8
Елемент в задната част на вектора: 8
Намерете елемент във вектора
Функцията „намиране“ се използва, за да се намери дали определен елемент (наричан ключ) присъства във вектора или не. Тази функция трябва да бъде бърза и ефективна. След като стойността бъде намерена, функцията се връща.
Следващият пример показва използването на функцията за намиране.
#include #include #include using namespace std; int main() { // Assign vector vector myvec = {1,1,2,3,5,8}; cout<<'
Input vector: '; for(auto it=myvec.begin();itkey; if(find(myvec.begin(),myvec.end(),key)!= myvec.end()) cout<<'
Element found'; else cout<<'
Element not found'; }
Изход:
най-добрият софтуер за наблюдение на температурата на процесора
Входен вектор: 1 1 2 3 5 8
Въведете ключа за търсене: 0
Елементът не е намерен
2D вектор
Двуизмерният вектор е известен още като „Vector of Vector“. Подобно на двумерните масиви, елементите на двумерните вектори също са подредени във формата на матрицата.
Примерна програма за 2D вектор е дадена по-долу.
#include #include // for 2D vector using namespace std; int main() { // Initializing 2D vector 'odd_vect' with vector odd_vect{ { 1, 3, 5 }, { 7, 9, 11 }, { 13,15,17 } }; // Displaying the 2D vector cout<<'2D vector : '; cout< Изход:
2D вектор:
1 3 5
7 9 11
13 15 17
В горния пример обърнете внимание на начина, по който се дефинира 2D вектора. Определя се като вектор в друг вектор. Докато показваме този 2D вектор, ние използваме същия подход като този при показване на 2D масиви.
Пример за вектор
По-долу е даден векторен пример, който съдържа повечето от векторните операции.
#include #include using namespace std; int main() { // Assign vector vector myvec; // assign value 10 5 times myvec.assign(5, 10); cout << 'The vector elements: '; for (int i = 0; i < myvec.size(); i++) cout << myvec[i] << ' '; // push value 5 in myvec myvec.push_back(5); int n = myvec.size(); cout << '
The new vector after push_back:'; for (int i = 0; i < myvec.size(); i++) cout << myvec[i] << ' '; // pop the element myvec.pop_back(); cout<<'
New vector after pop_back : '; for (int i = 0; i < myvec.size(); i++) cout << myvec[i] << ' '; // inserts 20 at the beginning myvec.insert(myvec.begin(), 20); cout << '
New vector after insert: '; for (int i = 0; i < myvec.size(); i++) cout << myvec[i] << ' '; // remove the first element myvec.erase(myvec.begin()); cout<<'
Vector size after erase: '< Изход:
Елементите на вектора: 10 10 10 10 10
Новият вектор след push_back: 10 10 10 10 10 5
Нов вектор след pop_back: 10 10 10 10 10
Нов вектор след вмъкване: 20 10 10 10 10 10
Размер на вектора след изтриване: 5
След изтриване на първия елемент: 10 10 10 10 10
Следва екранната снимка за същото.
В горния пример декларираме вектор и след това с помощта на функции assign и push_back въвеждаме елементи във вектора. След това използваме функцията pop_back, за да премахнем елемент от края на вектора. След това отново добавяме един елемент към вектора, като използваме елемента за вмъкване и след това изтриваме елемента с помощта на функцията за изтриване.
Това е пример от край до край на векторния контейнер, демонстриращ различните му функции.
Заключение
С това стигнахме до края на този урок за вектор.
В нашия предстоящ урок ще научим за контейнера ‘list’ на STL, който е подобен на линиите на масиви и вектори.
=> Вижте Перфектното ръководство за обучение на C ++ тук.
Препоръчително четене