Как заполнить вектор с клавиатуры c
БлогNot. C++: изучаем стандартный контейнер vector
C++: изучаем стандартный контейнер vector
Стандартная библиотека шаблонов STL (Standard Template Library)позволяет создавать списки, векторы, очереди, стеки и т.д. из элементов любых типов данных. Не для всех контейнеров есть готовые шаблоны, скажем, их нет для матрицы, произвольного дерева узлов и т.д. Но в таких случаях можно использовать одни шаблоны для создания других.
Класс vector - самый простой и часто применяемый шаблон стандартной библиотеки STL. По сути, он призван заменить "неуправляемый" (точнее, управляемый программистом) динамический массив. Вектор удобнее, чем обычный динамический массив. Он не ускорит работу вашей программы и не предоставит каких-либо "секретных механизмов" управления оперативной памятью. Он просто возьмёт на себя заботу о своей размерности и предоставит методы для типовых операций с массивами.
Для работы с векторами подключается заголовочный файл vector и стандартное пространство имен:
Пространство имён можно, конечно, и не подключать, но тогда придётся везде писать std::vector вместо vector .
Для начала опишем пустой вектор:
Из описания видно, что мы имеем дело с шаблоном, то есть, вектор можно составлять из элементов любого простого или составного типа. Здесь мы использовали тип элементов int .
Теперь посмотрим, как вектор управляет распределением памяти:
Этим оператором память зарезервирована под 10 элементов, но размерность вектора, возвращаемая методом v.size() , всё равно равна нулю.
Вот теперь размерность вектора действительно равна 10, и метод v.size() вернёт это значение.
Все показанные три действия мы могли выполнить одним оператором:
Здесь произошёл вызов конструктора класса vector , мы которому передали аргумент-размерность, равный 10.
- переопределенным оператором [] - корректность индекса тогда не контролируется, как и для обычных массивов C/C++;
- методом at(i) , где i - индекс нужного элемента, при этом, контролируется корректность индекса, и, если нужно, генерируется исключение.
Например, показанный ниже код не сгенерирует исключения (в новых сборках Visual Studio 2019 уже сгенерируется системное исключение):
А вот этот - сгенерирует:
Проверить, пуст ли вектор, можно методом empty :
Как и для динамических массивов, для обработки векторов часто пишут функции. Так как вектор - это шаблонный класс, удобнее в функциях также применять шаблоны. Например, метод печати вектора в консоль может иметь вид:
Это сработает с любым скалярным типом данных, для которого компилятор смог переопределить оператор [] :
Скопировать вектор можно как минимум двумя способами:
1. Вызвать конструктор, которому передать ранее определенный вектор:
2. Скопировать вектор поэлементно в цикле for с помощью оператора [] или метода at , думаю, Вы легко напишете такой код самостоятельно.
Векторы можно сравнивать переопределённым оператором == :
Для добавления элементов сущестует метод insert , имеющий несколько перегрузок:
Здесь мы уже чуть забежали вперёд, потому что метод insert , как и другие методы класса, для перебора элементов контейнера требует определить итератор (аналог указателя для обычных массивов):
Можно вставить значение в вектор и другим методом:
Аналогично обстоит дело с методом erase для удаления элементов и другими методами класса. Более того, многие имена методов применимы и к другим контейнерам STL, а не только к вектору.
Чаще всего для добавления элемента в конец вектора пишут так:
Возможен и вполне традиционный ввод элементов вектора с клавиатуры:
Изучив итераторы и встроенные алгоритмы, мы могли бы выполнить обмен данными с консолью и без "видимых" циклов:
Как и на обычные динамические структуры, на контейнеры можно создавать указатели:
и затем "шагать" по массиву, увеличивая или уменьшая указатель, правда, в обычных приложениях это едва ли пригодится.
Читайте также: