C++. Клас vector. Методи, що змінюють дані в масиві

Клас vector. Методи, що змінюють дані в масиві. Методи push_back(), pop_back(), clear(), swap(), operator=(), erase(), insert(), 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;

...

 


Споріднені теми