Основи програмування на С ++ для початківців

Контейнери STL: vector. Частина 3

В попередньому уроці ми визначили змінну типу vector<float>, як еквівалент масиву, розмір якого ми зможемо довільно змінювати по ходу виконання коду. Але це не означає (так само як і для класичних векторів C ++), що ми можемо таким чином створювати тільки динамічні масиви найпростіших вбудованих типів. Тип елемента вектора може бути довільним і як завгодно складним! Наприклад, ми могли б описати студентську групу так:

Контейнери C ++ STL , Стандартна бібліотека шаблонів, вектор з ++, вектор C ++

У цьому прикладі, не зважаючи на все інше, ми застосували покажчик this  і перевантаження операторів. Залишаю посилання для вас, якщо комусь необхідно освіжити це в пам'яті.

Шаблонним класом вектора (і будь-якого контейнера STL) може бути, в свою чергу, STL контейнер. Наприклад vector< vector<int> >  или vector< vector< vector<int> > >  (не забудьте пробіл між закриваються дужками ‘>‘ - Це особливість синтаксичного розбирача). Таким чином ми можемо, например, створити клас трикутних матриць:

Контейнери C ++ STL , Стандартна бібліотека шаблонів, вектор з ++, вектор C ++
Наступним рівнем нашого поглиблення в техніку векторів, і контейнерів STL взагалі, буде поняття итератор. Итератор - центральне поняття для роботи з контейнерами STL. итератор – це деяка абстракція, яка застосовується для виконання ітерації (перебору) елементів в контейнері STL і надання доступу до окремих елементів.

итератор p не є покажчиком, але, спершу, ви можете умовно вважати його як щось подібне з вигляду: *p позначатиме значення даних під поточним ітератором, p переводить итератор на наступний елемент контейнера, а p– (коли це допустимо) - На попередній елемент. Для різних типів контейнерів, відповідні їм ітератори можуть належати до однієї з 5-ти категорій: вхідні, вихідні, односпрямовані, двонаправлені і довільного доступу.

Ітератори векторів - це ітератори прямого доступу. Саме тому для векторів можлива операція індексації. цих, досить поверхневих, знань про ітератори нам досить для того, щоб почати працювати з ними.

Воспроізведём в термінах ітераторів завдання знаходження всіх простих чисел, що не перевищують N (решето Ератосфена), яку ми вже вирішували раніше в техніці масивів C ++:

Як легко бачити з опису vector<bool>::итератор, що итератор зберігає в собі вид контейнера, до якого відноситься, і тип елементів цього контейнера. Це вимагає досить громіздкою записи з точним описом типу ітератора. Але останній стандарт C ++ 11 ввів поняття виводимості типу: якщо необхідний тип об'єкта виводиться з контексту його використання, то тип об'єкта може бути оголошений описателем автоматичний (виведений тип). тоді рядок 16 показаного вище коду може бути записана так:

нарешті, для векторів (і для всіх контейнерів, мають двонаправлені iteratorи, як згадувалося вище) можуть бути визначені реверсні ітератори, які переміщуються не від початку контейнера до кінця, а навпаки - з кінця в початок. Такий итератор повинен оголошуватися як зовсім інший тип, например:

Але і тут ми можемо покластися на виведення типів, як в наступному прикладі:

Контейнери C ++ STL , Стандартна бібліотека шаблонів, вектор з ++, вектор C ++

Питання, що виникають по уроку задавайте в коментарях.

4 думки про "Контейнери STL: vector. Частина 3

  1. Пристрасть - співчуття чудове , але люта ілюзія змушує нас засумніватися в то , що однією пристрасті для милого розлучення занадто . Зважившись на такий істотний ривок , як заручини , потрібно постаратися методологічно оцінити обґрунтованість свого ҏешенія .

залишити коментар

Ваша електронна адреса не буде опублікований. Обов'язкові поля позначені * *