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

Контейнери STL: vector. Частина 3
5 (100%) 1 голосування




Контейнери 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 ++

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

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

Olej

Про Olej

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

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

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

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