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




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

В попередньому уроці ми визначили змінну типу 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 ++

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

Нові уроки з програмування:

дата
сторінка
Контейнери STL: vector. Частина 3
рейтинг
51зірка1зірка1зірка1зірка1зірка
Olej

Про Olej

Стаж практичних програмних розробок близько 40 лет. Викладач міжнародної софтверної компанії Global Logic. Постійний автор публікацій IBM Developer Works. Науковий редактор книжкового видавництва комп'ютерної літератури "Символ-Плюс", Санкт-Петербург.

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

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

Код розміщуйте в тегах: <pre class="lang:C ++ декодуванням:true ">ВАШ КОД</заздалегідь>