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

Клас vector. Методи, що забезпечують доступ до елементів масиву. Методи at(), front(), back(), data(), begin(), end(), cbegin(), cend(), rbegin(), rend(), crbegin(), crend()

Перед вивченням даної теми рекомендується ознайомитись з наступною темою:


Зміст


Пошук на інших ресурсах:

1. Метод at(). Отримати елемент вектору за його позицією

Метод at() використовується для доступу до конкретного елементу масиву на основі заданого індексу. Метод має 2 перевантажені реалізації

const T& at(const size_t _Pos) const
T& at(const size_t _Pos)

тут T – тип елементів масиву.

Перша реалізація використовується для читання елементу з масиву. Друга реалізація використовується для зміни елементу масиву.

Приклад.

...

// Метод at() - отримати елемент вектору за його позицією
vector<double> A(5); // Створити масив з 5 елементів типу double

// Заповнити довільними значеннями
A[0] = 2.8;
A[1] = 3.3;
A[2] = 4.5;
A[3] = 7.3;
A[4] = 8.8;

// Зчитати елемент з індексом 2
double x = A.at(2); // x = 4.5

// Змінити значення елементу з індексом 2
A.at(2) = 3.7;

...

 

2. Метод front(). Повертає посилання на перший елемент вектору

З допомогою методу front() можна отримати посилання на перший елементу масиву. Синтаксис оголошення двох перевантажених реалізацій методу наступний

const T& front() const
T& front()

Перша реалізація методу дозволяє зчитувати значення першого елементу масиву. Друга реалізація дозволяє записувати значення в перший елемент масиву.

Приклад.

...

// Метод front() - отримати значення першого елементу масиву.
// 1. Оголосити масив з 5 елементів типу float
vector<float> A(5);

// 2. Заповнити масив даними
A[0] = 2.88f;
A[1] = 3.8f;
A[2] = 4.4f; 
A[3] = 4.9f;
A[4] = 5.5f;

// 3. Зчитати та вивести на екран значення першого елементу вектору
float x = A.front();
cout << x << endl; // 2.88

...

 

3. Метод back(). Повертає посилання на останній елемент вектору

Щоб отримати доступ до останнього елементу вектору використовується метод back(). Цей метод має 2 перевантажені реалізації, синтаксис оголошення яких наступний

const T& back() const
T& back()

Перша реалізація використовується, коли потрібно зчитати значення з останнього елементу вектору. Друга реалізація використовується, коли потрібно записати значення в останній елементу вектору.

Приклад.

...

// Метод back() - отримати значення останнього елементу масиву.
// 1. Оголосити масив з 5 елементів типу float
vector<float> A(5);

// 2. Заповнити масив даними
A[0] = 2.88f;
A[1] = 3.8f;
A[2] = 4.4f; // так теж можна
A[3] = 4.9f;
A[4] = 5.5f;

// 3. Зчитати та вивести на екран значення останнього елементу масиву
float x = A.back();
cout << x << endl; // 5.5

// 4. Змінити останній елемент масиву
A.back() = 7.9f; // A[4] = 7.9
cout << A[4] << endl; // 7.9

...

 

4. Метод data(). Отримати покажчик на вектор

Метод data() дозволяє отримати покажчик на динамічний масив. З допомогою цього покажчика можна мати доступ до елементів вектору як до звичайного масиву.

Синтаксис оголошення методу наступний:

T* vector<T>::data()

тут T – тип елементів вектору.

Приклад.

...

// Метод data() - отримати покажчик на вектор.
// 1. Оголосити вектор з 10 елементів типу short.
vector<short> A(10);

// 2. Заповнити масив даними
for (int i = 0; i < A.size(); i++)
  A.at(i) = i;

// 3. Отримати покажчик на вектор
short* p = A.data();

// 4. З допомогою покажчика p вивести елементи вектору на екран
for (int i=0; i<A.size(); i++)
  cout << *(p + i) << " ";

// 5. Вивести елемент вектору з індексом 2
cout << endl;
cout << p[2] << endl; // 2

...

 

5. Метод begin(). Повернути ітератор, що вказує на перший елемент вектору

Метод begin() повертає ітератор, який вказує на перший елемент динамічного масиву. Метод має наступну загальну форму:

vector<T>::iterator vector<T>::begin()

тут T – тип елементів масиву.

Приклад.

...

// Метод begin() - повертає ітератор, що встановлений на перший елемент вектору
// 1. Оголосити вектор з 5 елементів типу char
vector<char> A(5);

// 2. Заповнити масив даними
A[0] = 'a';
A[1] = 'b';
A[2] = 'c';
A[3] = 'd';
A[4] = 'e';

// 3. Оголосити ітератор на масив елементів типу char
vector<char>::iterator pA;

// 4. Встановити ітератор на початок масиву та вивести перший елемент
pA = A.begin(); // *pA = 'a'
cout << *pA << endl;

...

 

6. Метод end(). Повернути ітератор, що вказує на останній елемент масиву

Метод end() встановлює ітератор на кінець масиву. Це означає, що ітератор встановлений на елемент, що слідує за останнім елементом масиву.

C++. STL. Клас vector. Встановлення ітераторів методами begin() та end()Рисунок 1. Встановлення ітераторів методами begin() та end(). Розмір масиву size()

Синтаксис оголошення методу наступний

vector<T>::iterator vector<T>::end()

Приклад.

...

// Метод end() - повертає ітератор, що встановлений кінець масиву.
// 1. Оголосити вектор з 5 елементів типу char.
vector<char> A(5);

// 2. Заповнити масив даними
A[0] = 'a';
A[1] = 'b';
A[2] = 'c';
A[3] = 'd';
A[4] = 'e';

// 3. Оголосити ітератор на масив елементів типу char
vector<char>::iterator pA;

// 4. Встановити ітератор на кінець масиву
pA = A.end(); // pA вказує на позицію, що встановлена за останнім елементом масиву

// 5. Перейти на останній елемент масиву
pA--; // *pA = 'e'
cout << *pA << endl;

...

 

7. Методи cbegin(), cend(). Встановити константний ітератор на початок та кінець масиву

При роботі з ітераторами, крім звичайних ітераторів розрізняють константні ітератори. У бібліотеці STL стандартний ітератор оголошується з використанням типу iterator

vector<T>::iterator It;

Константний ітератор оголошується з використанням типу constant_iterator

vector<T>::constant_iterator ConstIt;

тут

  • T – тип елементів масиву;
  • constant_iterator – тип, що визначає константний ітератор;
  • ConstIt – ім’я константного ітератора.

На відміну від звичайного (стандартного) ітератора, неможливо змінити значення елементу масиву за константним ітератором. Тобто, присвоєння константному ітератору деякого значення value

*ConstIt = value;

викличе помилку компіляції.

Методи cbegin() та cend() призначені для отримання константного ітератора, що вказує відповідно на початок та кінець масиву. Загальна форма оголошення методів наступна

vector<T>::const_iterator cbegin() const
vector<T>::const_iterator cend() const

тут T – тип елементів масиву.

Метод cend() повертає ітератор, що вказує на елемент, що слідує за останнім елементом масиву.

Приклад.

...

// Константний ітератор const_iterator
// 1. Створити масив цілих чисел на основі списку ініціалізації
initializer_list<int> L = { 1, 2, 3, 4, 5 };
vector<int> A1(L); // A1 = { 1, 2, 3, 4, 5 }

// 2. Оголосити константний ітератор it на початок вектору A1
vector<int>::const_iterator it = A1.cbegin();

// 3. З допомогою константного ітератора вивести елементи вектору A1
cout << "A1 = ";
while (it != A1.cend())
  cout << *it++ << " ";
cout << endl;

// 4. Спроба зміни значення за константним ітератором викличе помилку компіляції
it = A1.cbegin();
//*it = 8; // помилка компіляції

...

 

8. Методи rbegin(), rend(). Доступ до елементів масиву з допомогою реверсного ітератора

Реверсний ітератор відрізняється від звичайного ітератора тим, що порядок слідування елементів розглядається з кінця до початку. З цієї точки зору вносяться усі можливі зміни в методах обробки та операціях над ітераторами. Так, наприклад, операція приросту ітератору it++ здійснює перехід до попереднього елементу ітератору, а не до наступного, як у звичайному ітераторі.

Реверсний ітератор оголошується з використанням ключового слова reverse_iterator

vector<T>::reverse_iterator itReverse;

тут

  • T – тип елементів вектору;
  • itReverse – ім’я ітератора.

Методи rbegin(), rend() працюють з реверсними ітераторами. Вони дозволяють отримати ітератори, що вказують відповідно на початок (rbegin) та кінець (rend) масиву. Методи мають наступні перевантажені реалізації

reverse_iterator<vector<T>::iterator> rbegin()
reverse_iterator<vector<T>::const_iterator> rbegin() const
reverse_iterator<vector<T>::iterator> rend()
reverse_iterator<vector<T>::const_iterator> rend() const

Одна з реалізацій методів rbegin() та rend() дозволяє працювати як звичайний ітератор, що допускає читання/запис. Друга реалізація цих методів працює як константний ітератор, що допускає тільки читання.

Приклад.

#include <iostream>
#include <vector>
using namespace std;

void main()
{
  // Реверсний ітератор const_iterator
  // 1. Створити масив дійсних чисел на основі списку ініціалізації
  initializer_list<double> L = { 1.5, 2.2, 3.4, 4.1, 5.8 };
  vector<double> A1(L); // A1 = { 1.5, 2.2, 3.4, 4.1, 5.8 };

  // 2. Оголосити реверсний ітератор itReverse на тип double
  vector<double>::reverse_iterator itReverse;

  // 3. Встановити реверсний ітератор на початок вектору A1
  itReverse = A1.rbegin();

  // 4. Вивести перший елемент масиву
  cout << "begin: " << *itReverse << endl;

  // 5. З допомогою реверсного ітератора вивести елементи всього вектору A1.
  // Важливо: елементи виводяться у зворотному порядку
  cout << "A1 = ";
  while (itReverse != A1.rend())
  {
    cout << *itReverse << " ";
    itReverse++; // приріст ітератора зміщується з кінця до початку
  }
  cout << endl;

  // 6. Змінити значення елементу з індексом 3
  itReverse = A1.rbegin() + 3; // індексація елементів йде з кінця
  *itReverse = 8.5; // Ок!
  cout << "A1[3] = " << A1[3] << endl;
}

Результат виконання програми

begin: 5.8
A1 = 5.8 4.1 3.4 2.2 1.5
A1[3] = 4.1

 

9. Методи crbegin(), crend(). Встановити на початок та кінець масиву константний реверсний ітератор

Крім константного ітератора constant_iterator, у бібліотеці STL введено константний реверсний ітератор, який розглядає масив з кінця до початку. Такий ітератор оголошується наступним чином

vector<T>::const_reverse_iterator itConstReverse;

тут

  • T – тип елементів масиву;
  • itConstReverse – ім’я константного реверсного ітератора.

Змінити значення елементів масиву з допомогою константного реверсного ітератора не вдасться.

Методи crbegin(), crend() призначені для роботи з типом константного реверсного ітератора constant_reverse_iterator і мають наступні оголошення

Приклад.

#include <iostream>
#include <vector>
using namespace std;

void main()
{
  // Константний реверсний ітератор const_reverse_iterator
  // 1. Створити масив символів списку ініціалізації
  initializer_list<char> L = { 'a', 'b', 'c', 'd' };
  vector<char> A1(L); // A1 = { 'a', 'b', 'c', 'd' };

  // 2. Оголосити константний реверсний ітератор itConstReverse на тип char
  vector<char>::const_reverse_iterator itConstReverse;

  // 3. Встановити константний реверсний ітератор на початок вектору A1
  itConstReverse = A1.crbegin();

  // 4. Вивести перший елемент масиву
  cout << "begin: " << *itConstReverse << endl;

  // 5. З допомогою константного реверсного ітератора вивести елементи всього вектору A1.
  // Важливо: елементи виводяться у зворотному порядку
  cout << "A1 = ";
  while (itConstReverse != A1.crend())
  {
    cout << *itConstReverse << " ";
    itConstReverse++;
  }
  cout << endl;

  // 6. Змінити значення елементу з індексом 3 не вдасться
  itConstReverse = A1.crbegin() + 3;
  //*itConstReverse = 8.5; // помилка компіляції
}

Результат виконання програми

begin: d
A1 = d c b a

 


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