Клас vector. Методи, що змінюють дані в масиві. Методи push_back(), pop_back(), clear(), swap(), operator=(), erase(), insert(), assign()
Перед вивченням даної теми рекомендується ознайомитись з наступною темою:
Зміст
- 1. Метод push_back(). Додати елемент в кінець вектору
- 2. Метод pop_back(). Видалити останній елемент вектору
- 3. Метод clear(). Видаляє з масиву всі елементи
- 4. Метод swap(). Обмін місцями двох векторів
- 5. Присвоєння масивів. Перевантажений оператор =
- 6. Метод erase(). Видалити елемент або ряд елементів заданого діапазону
- 7. Метод insert(). Вставляє елемент або групу елементів у вектор
- 8. Метод assign(). Утворити масив з існуючих даних
- Споріднені теми
Пошук на інших ресурсах:
1. Метод push_back(). Додати елемент в кінець вектору
Щоб додати елемент в кінець масиву використовується метод push_back(). Метод має 2 перевантажені реалізації, синтаксис оголошення яких наступний
void vector<T>::push_back(T&& val) void vector<T>::push_back(const T& val)
тут T – тип елементів вектору.
Приклад.
... // Метод push_back() - додати елемент в кінець вектору. // 1. Оголосити вектор з 10 елементів типу long long. vector<long long> A(10); // 2. Заповнити масив даними for (int i = 0; i < A.size(); i++) A[i] = i * i; // 3. Додати елемент в кінець масиву A.push_back(10000L); // 4. Отримати нову довжину масиву int count = A.size(); // count = 11 ...
⇑
2. Метод pop_back(). Видалити останній елемент вектору
Для видалення останнього елементу динамічного масиву використовується метод pop_back(). Синтаксис оголошення методу наступний
void vector<T>::pop_back()
тут T – тип елементів масиву.
Приклад.
... // Метод pop_back() - видалити останній елемент з масиву. // 1. Оголосити покажчик на вектор з 5 елементів типу float. vector<float>* A = new vector<float>(5); // 2. Заповнити масив даними A->at(0) = 2.88f; A->at(1) = 3.8f; A->operator[](2) = 4.4f; // так теж можна A->at(3) = 4.9f; A->at(4) = 5.5f; // 3. Вивести масив в рядок for (int i = 0; i < A->size(); i++) cout << A->at(i) << " "; // 4. Видалити останній елемент A->pop_back(); // 5. Отримати нову довжину масиву int count = A->size(); // count = 4 ...
⇑
3. Метод clear(). Видаляє з масиву всі елементи
Метод clear() призначений для видалення з масиву всіх елементів. Довжина масиву, яка повертається методом size(), стає рівна 0. Синтаксис оголошення методу clear() наступний:
void vector<T>::clear()
тут T – тип елементів масиву.
Приклад.
... // Метод clear() - видаляє з масиву всі елементи. // 1. Оголосити вектор з 10 елементів типу short. vector<short> A(10); // 2. Заповнити масив даними for (int i = 0; i < A.size(); i++) A.at(i) = i; // 3. Вивести розмір масиву cout << A.size() << endl; // 10 // 4. Видалити з масиву всі елементи A.clear(); // 5. Повторно вивести розмір масиву cout << A.size() << endl; // 0 ...
⇑
4. Метод swap(). Обмін місцями двох векторів
Метод swap() використовується для обміну двох векторів місцями. Типи векторів повинні співпадати. Загальна форма оголошення методу наступна
void vector<T>::swap(vector<T>& _Right)
тут
- T – тип елементів вектору;
- _Right – масив, що обмінюється з поточним масивом.
Приклад.
... // Метод swap() - обмін векторів місцями // 1. Оголосити два масиви vector<short> A1; vector<short> A2; // 2. Заповнити масиви даними initializer_list<short> L1 = { 1, 2, 3, 4 }; initializer_list<short> L2 = { 5, 6, 7, 8, 9 }; A1.assign(L1); // A1 = { 1, 2, 3, 4 } A2.assign(L2); // A2 = { 5, 6, 7, 8, 9 } // 3. Обміняти місцями два масиви A1.swap(A2); // A1 = { 5, 6, 7, 8, 9 }, A2 = { 1, 2, 3, 4 } ...
⇑
5. Присвоєння масивів. Перевантажений оператор =
Динамічний масив типу vector допускає операцію присвоєння одного масиву іншому з допомогою перевантаженого оператору =. У цьому випадку створюється додаткова копія іншого масиву. Таким чином, масиви розміщені в різних ділянках пам’яті.
Приклад.
... // Присвоєння масивів // 1. Створити масив цілих чисел на основі списку ініціалізації initializer_list<int> L = { 1, 2, 3, 4, 5 }; vector<int> A1(L); // A1 = { 1, 2, 3, 4, 5 } // 2. Оголосити другий пустий масив vector<int> A2; // 3. Присвоїти один масив іншому A2 = A1; // A2 = { 1, 2, 3, 4, 5 } ...
⇑
6. Метод erase(). Видалити елемент або ряд елементів заданого діапазону
Метод erase() використовується для видалення елементів з динамічного масиву типу vector. Метод має дві перевантажені реалізації.
Перша реалізація має наступний синтаксис:
vector<T>::iterator erase(vector<T>::const_iterator First, vector<T>::const_iterator Last)
тут
- T – тип елементів масиву;
- First – ітератор, який вказує на перший елемент діапазону що видаляється;
- Last – ітератор, який вказує на елемент, що знаходиться за останнім елементом діапазону, що видаляється.
Дана реалізація методу erase() повертає ітератор, що вказує на фрагмент вихідного масиву, який починається з ітератору Last.
Друга реалізація має синтаксис:
vector<T>::iterator erase(vector<T>::const_iterator Where)
тут
- T – тип елементів масиву;
- Where – ітератор, що вказує на елемент в масиві, який потрібно видалити.
У цій реалізації повертається ітератор, який вказує на початок вихідного масиву.
Приклад. У прикладі наведено демонстраційну програму, в якій використовується метод erase().
#include <iostream> #include <vector> using namespace std; void main() { // 1. Створити вектор з 10 цілих чисел vector<int> A(10); // 2. Заповнити вектор даними: A = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] for (int i = 0; i < A.size(); i++) A[i] = i; // 3. Вивести масив A на екран cout << "A = "; for (int i = 0; i < A.size(); i++) cout << A[i] << " "; cout << endl; // 4. Видалити елементи з індексами від 2 до 4 включно // 4.1. Оголосити 3 ітератори vector<int>::iterator it1 = A.begin() + 2; // ітератор вказує на елемент з індексом 2 vector<int>::iterator it2 = A.begin() + 5; // ітератор вказує на елемент з індексом 5 vector<int>::iterator it3; // ітератор, що буде вказувати на другий фрагмент масиву A // 4.2. Виклик методу erase() - видалити фрагмент it3 = A.erase(it1, it2); // A = [ 0, 1, 5, 6, 7, 8, 9 ] // 5. Вивести результат за ітератором it3. // Ітератор вказує на фрагмент масиву it3 => [ 5, 6, 7, 8, 9 ] cout << "it3 => "; while (it3 != A.end()) { cout << *it3 << " "; it3++; } cout << endl; // 6. Вивести масив після видалення: A = [ 0, 1, 5, 6, 7, 8, 9 ] cout << "A = "; for (int i = 0; i < A.size(); i++) cout << A[i] << " "; cout << endl; // 7. Видалити перший елемент в масиві // 7.1. Оголосити ітератор на перший елемент масиву vector<int>::iterator it4 = A.begin(); // 7.2. Викликати метод erase() з параметром одиночного ітератора A.erase(it4); // 7.3. Вивести масив A знову cout << "A = "; for (int i = 0; i < A.size(); i++) cout << A[i] << " "; cout << endl; }
Результат виконання програми
A = 0 1 2 3 4 5 6 7 8 9 it3 => 5 6 7 8 9 A = 0 1 5 6 7 8 9 A = 1 5 6 7 8 9
⇑
7. Метод insert(). Вставляє елемент або групу елементів у вектор
Метод insert() забезпечує декілька різновидів вставки одного або декількох елементів у масив. Кожен різновид визначений окремою перевантаженою реалізацією методу.
7.1. Вставка списку ініціалізації у вектор
При цьому способі вставки оголошення методу insert() наступне:
vector<T>::iterator insert( vector<T>::const_iterator _Where, initializer_list _llist )
тут
- T – тип елементів масиву;
- initializer_list – тип списку ініціалізації;
- _Where – ітератор, який вказує на позицію вставки;
- _Ilist – список ініціалізації.
Метод повертає ітератор, що вказує на початок фрагменту вставки.
Приклад.
#include <iostream> #include <vector> using namespace std; void main() { // Метод insert() - вставка списку ініціалізації у вектор // 1. Оголосити масив з 5 елементів типу double vector<double> A(5); // 2. Заповнити масив числами 1.0 A.assign(5, 1.0); // A = { 1.0, 1.0, 1.0, 1.0, 1.0 } // 3. Вставити список ініціалізації в позицію 2 // 3.1. Оголосити список ініціалізації L initializer_list<double> L = { 2.2, 3.2 }; // 3.2. Оголосити ітератор та направити його на позицію 2 vector<double>::iterator it = A.begin() + 2; // 3.3. Викликати метод insert() vector<double>::iterator it2; it2 = A.insert(it, L); // A = { 1, 1, 2.2, 3.2, 1, 1, 1 } // 4. Вивести змінений масив A cout << "A = "; for (int i = 0; i < A.size(); i++) cout << A[i] << " "; cout << endl; // 5. Вивести дані за ітератором cout << "it2 => "; while (it2 != A.end()) { cout << *it2 << " "; it2++; } }
Результат виконання програми
A = 1 1 2.2 3.2 1 1 1 it2 => 2.2 3.2 1 1 1
⇑
7.2. Вставка елементу задану кількість разів у задану позицію
Дана реалізація методу дозволяє вставити елемент у задану позицію задану кількість разів
vector<T>::iterator insert( vector<T>::const_iterator _Where, const size_t _Count, const T& Val )
тут
- T – тип елементів масиву;
- _Where – ітератор, який вказує на позицію вставки;
- _Count – кількість елементів Val, які потрібно вставити у масив;
- Val – елемент, що вставляється у масив.
Приклад.
#include <iostream> #include <vector> using namespace std; void main() { // Метод insert() - вставка елементу задану кількість разів // 1. Оголосити масив з 5 елементів типу char vector<char> A(5); // 2. Заповнити масив символами: A = { '-', '-', '-', '-', '-' } for (int i = 0; i < A.size(); i++) A[i] = '-'; // 3. Вставити 4 символи '+' в позицію 3 масиву // 3.1. Оголосити ітератор на позицію 3 vector<char>::iterator it = A.begin() + 3; // 3.2. Викликати метод insert() vector<char>::iterator it2; it2 = A.insert(it, 4, '+'); // 4. Вивести результуючий масив cout << "A = "; for (int i = 0; i < A.size(); i++) cout << A[i] << " "; cout << endl; // 5. Вивести фрагмент, на який вказує ітератор it2 cout << "it2 => "; while (it2 != A.end()) { cout << *it2 << " "; it2++; } }
Результат виконання програми
A = - - - + + + + - - it2 => + + + + - -
⇑
7.3. Вставка одиночного елементу у задану позицію
Для вставки одиночного елементу в позицію, на яку вказує ітератор використовується одна з наступних форм методу insert()
vector<T>::iterator insert(vector<T>::const_iterator _Where, T&& _Val) vector<T>::iterator insert(vector<T>::const_iterator _Where, const T& _Val)
тут
- T – тип елементів масиву;
- _Where – ітератор, який вказує на позицію вставки;
- _Val – значення, що вставляється.
Дана форма функції повертає ітератор, який вказує на позицію вставки.
Приклад.
#include <iostream> #include <vector> using namespace std; void main() { // Метод insert() - вставка одиночного елементу в задану позицію // 1. Оголосити масив з 5 елементів типу short vector<short> A(5); // 2. Заповнити масив числами на основі списку ініціалізації initializer_list<short> L = { 1, 2, 3, 4, 5 }; A.assign(L); // 3. Вставити у позицію 0 число 100 // 3.1. Оголосити ітератор, який вказує на позицію 0 vector<short>::iterator it = A.begin(); // 3.2. Викликати метод insert() vector<short>::iterator it2 = A.insert(it, 100); // 4. Вивести результуючий масив cout << "A = "; for (int i = 0; i < A.size(); i++) cout << A[i] << " "; cout << endl; // 5. Вивести фрагмент, на який вказує ітератор it2 cout << "it2 => "; while (it2 != A.end()) { cout << *it2 << " "; it2++; } }
Результат виконання програми
A = 100 1 2 3 4 5 it2 => 100 1 2 3 4 5
⇑
7.4. Вставка декількох елементів з заданого діапазону
Для вставки групи елементів з іншого масиву, що задані діапазоном, використовується наступна форма методу insert()
vector<T>::iterator insert<_Iter <unnamed>>( vector<T>::const_iterator _Where, _Iter _First, _Iter _Last )
тут
- T – тип елементів масиву;
- _Where – ітератор, що вказує позицію вставки у поточному масиві;
- _First, _Last – ітератори, що вказують на позиції початку та кінця діапазону масиву, що є джерелом.
Метод повертає ітератор, що вказує на позицію вставки.
Приклад.
#include <iostream> #include <vector> using namespace std; void main() { // Метод insert() - вставка групи елементів, що задані діапазоном // 1. Оголосити два масиви vector<short> A1(5); vector<short> A2(5); // 2. Заповнити масиви даними initializer_list<short> L1 = { 0, 1, 2, 3, 4 }; initializer_list<short> L2 = { 5, 6, 7, 8, 9 }; A1.assign(L1); // A1 = { 0, 1, 2, 3, 4 } A2.assign(L2); // A2 = { 5, 6, 7, 8, 9 } // 3. Реалізувати вставку елементів з індексами [1, 2, 3] масиву A2 в // позицію 3 масиву A1. // Результуючий масив має бути таким: A1 = { 0, 1, 2, 6, 7, 8, 3, 4 } // 3.1. Оголосити ітератор на масив A1, який вказує на позицію 3 vector<short>::iterator Where = A1.begin() + 3; // 3.2. Оголосити ітератори, які вказують на діапазон [1..3] масиву A2 vector<short>::iterator First = A2.begin() + 1; vector<short>::iterator Last = A2.begin() + 4; // наступний після 3 // 3.3. Викликати метод insert(), отримати результуючий ітератор vector<short>::iterator Result; Result = A1.insert(Where, First, Last); // 4. Вивести результуючий масив cout << "A1 = { "; for (int i = 0; i < A1.size(); i++) cout << A1[i] << " "; cout << "}" << endl; // 5. Вивести фрагмент, на який вказує ітератор Result cout << "Result => "; while (Result != A1.end()) { cout << *Result << " "; Result++; } }
Результат виконання програми
A1 = { 0 1 2 6 7 8 3 4 } Result => 6 7 8 3 4
⇑
8. Метод assign(). Утворити масив з існуючих даних
Метод assign() дозволяє утворити новий масив з існуючого масиву або існуючих даних. Метод assign() має декілька перевантажених реалізацій.
Перша реалізація дозволяє змінити існуючий масив та заповнити його значеннями
void assign(const size_t NewSize, const T& val)
тут
- T – тип елементів масиву;
- NewSize – новий розмір масиву (кількість елементів);
- val – значення, якими заповнюється масив.
Друга реалізація дозволяє сформувати один масив з іншого. Синтаксис оголошення такої форми методу assign() наступний
void assign<_Iter, <unnamed>>(_Iter First, _Iter Last)
тут
- _Iter – тип ітератора;
- First, Last – ітератори, що вказують на початок та кінець діапазону вихідного масиву, з якого утворюється новий масив.
Третя реалізація дозволяє сформувати масив зі списку ініціалізації
void assign(initializer_list<T> _Ilist)
тут
- T – тип елементів масиву;
- _Ilist – список ініціалізації.
Приклад.
... // Метод assign() - отримати новий масив на основі даних. // 1. Оголосити масив з 0 елементів типу int vector<int> A; // 2. Заповнити масив A значеннями 20 A.assign(3, 20); // A = [ 20, 20, 20 ] // 3. Оголосити новий масив з чисел та заповнити його даними vector<int> A2(5); A2[0] = 10; A2[1] = 22; A2[2] = 33; A2[3] = 41; A2[4] = 54; // 4. З допомогою ітераторів створити масив A на основі A2. // Взяти елементи з позиціями від 2 до 4 включно vector<int>::iterator iStart; vector<int>::iterator iEnd; iStart = A2.begin() + 2; // встановити ітератор на початок масиву iEnd = A2.begin() + 5; // встановити ітератор на кінець масиву A.assign(iStart, iEnd); // A = [ 33, 41, 54 ] // 5. Створити новий масив типу float на основі списку ініціалізації // 5.1. Оголосити список ініціалізації initializer_list<float> L = { 1.5f, 2.3f, -4.2f, 3.8f }; // 5.2. Оголосити пустий масив типу float vector<float> A3; // 5.3. Ініціалізувати масив A3 списком L A3.assign(L); cout << "------------" << endl; for (int i = 0; i < A3.size(); i++) cout << A3[i] << " "; cout << endl; ...
⇑
Споріднені теми
- Загальні відомості про клас vector. Огляд методів. Створення масиву. Способи доступу до елементів вектору
- Методи, що визначають та змінюють загальні характеристики масиву: size(), max_size(), capacity(), empty(), shrink_to_fit(), resize(), reserve()
- Методи, що забезпечують доступ до елементів масиву: at(), front(), back(), data(), begin(), end(), cbegin(), cend(), rbegin(), rend(), crbegin(), crend()
⇑