Как использовать вектор в c
Как использовать вектор (vecto) в C++
Массив — это серия объектов одного и того же типа в последовательных ячейках памяти. Массив не может увеличить длину руды. Вектор похож на массив, но его длина может быть увеличена или уменьшена. Следовательно, вектор имеет гораздо больше операций, чем массив.
C ++ имеет множество библиотек, все из которых составляют стандартную библиотеку C ++. Одна из этих библиотек — это библиотека контейнеров. Контейнер — это набор объектов, и с этой коллекцией можно выполнять определенные операции. Контейнеры C ++ можно сгруппировать в два набора: контейнеры последовательности и ассоциативные контейнеры. Контейнеры последовательности — это vector, array (не тот массив, который обсуждался ранее), deque, forward_list и list. Это разные коллекции (структуры данных, подобные массивам), и каждая предлагает различные компромиссы.
Любой программист должен знать, как решить, использовать ли вектор, массив, двухстороннюю очередь, forward_list или список. Когда программисту нужна структура, которая требует больше операций, чем те, которые связаны с обычным массивом, обычный массив использовать не следует.
Если задача включает частые вставки и удаления в середине последовательности, следует использовать список или forward_list. Если задача включает частые вставки и удаления в начале или конце последовательности, следует использовать двухстороннюю очередь. Вектор следует использовать, когда такого рода операции не требуются.
В этой статье показано, как использовать вектор C ++. Для понимания этой статьи вам потребуются некоторые знания указателей, ссылок и массивов C ++.
Класс и объекты
Класс — это набор переменных и функций, которые работают вместе, где переменным не присвоены значения. Когда переменным присваиваются значения, класс становится объектом. Различные значения, присвоенные одному и тому же классу, приводят к разным объектам; то есть разные объекты могут принадлежать к одному классу, но иметь разные значения. Создание объекта из класса также известно как создание экземпляра объекта.
Термин вектор описывает класс. Объект, созданный из вектора, имеет имя, выбранное программистом.
Функция, принадлежащая классу, необходима для создания экземпляра объекта из класса. В C ++ эта функция имеет то же имя, что и имя класса. Различные объекты, созданные (экземпляры) из класса, имеют разные имена, данные каждому из них программистом.
Создание объекта из класса означает создание объекта; это также означает создание экземпляра объекта.
Класс Vector
Векторный класс уже определен и находится в библиотеке. Чтобы использовать векторный класс, программист должен включить векторный заголовок в файл со следующей директивой предварительной обработки:
После включения заголовка становятся доступными все векторные функции (элементы данных и функции-члены). Чтобы использовать объект счетчика для вывода данных на терминал (консоль), также должен быть включен заголовок объекта. Чтобы написать программу с вектором, как минимум должны быть включены следующие заголовки:
Создание экземпляра вектора
Выше объявление массива с именем «foo» и количеством элементов «10». Это массив целых чисел. Объявление вектора аналогично. Для вектора количество элементов не является обязательным, поскольку длина вектора может увеличиваться или уменьшаться.
На этом этапе программы векторный класс уже определен в библиотеке, и заголовок включен. Вектор может быть создан следующим образом:
Здесь вектор принадлежит специальной функции-конструктору. Тип данных, которые будет содержать вектор, — это «int» в угловых скобках. Термин «vtr» — это имя, выбранное программистом для вектора. Наконец, «8» в скобках — это ориентировочное количество целых чисел, которые будет иметь вектор.
Перегрузка функции
Когда две или более разных сигнатур функций имеют одно и то же имя, это имя считается перегруженным. Когда вызывается одна функция, количество и тип аргументов определяют, какая функция выполняется.
Построение вектора
Построение вектора означает инстанцирование (создание) векторного объекта. Функция-конструктор перегружается следующим образом:
vector name
Это создает вектор нулевой длины и набирает «T.» Следующая инструкция создает вектор нулевой длины типа «float» с именем «vtr»:
vector name (n)
Это создает вектор с n элементами типа «T.» Утверждение для этого вектора с четырьмя элементами с плавающей запятой выглядит следующим образом:
vector name (n, t)
Это создает вектор из n элементов, инициализированных значением t. Следующий оператор создает вектор из 5 элементов, каждый из которых имеет значение 3,4:
Конструирование с инициализацией
Вектор может быть сконструирован (создан) и инициализирован одновременно одним из следующих двух способов:
Обратите внимание, что сразу после имени объекта скобок нет. Круглые скобки, используемые сразу после имени объекта, должны содержать список инициализаторов, как показано ниже:
Вектор может быть создан и инициализирован позже с помощью списка инициализаторов. В этом случае круглые скобки использоваться не будут:
Это конструктор копирования. Он создает вектор V2 как копию вектора V1. Следующий код иллюстрирует это:
Назначение вектора во время Construction
Во время построения может быть создан пустой вектор, в то время как ему назначен другой, следующим образом:
Второй оператор эквивалентен:
const Vector
Константный вектор — это вектор, элементы которого нельзя изменить. Значения в этом векторе доступны только для чтения. При создании вектор выглядит следующим образом:
В этом векторном типе ни один элемент не может быть добавлен или удален. Более того, никакое значение не может быть изменено.
Конструирование с помощью Iterator
Шаблон предоставляет общее представление для типа данных. Итератор обеспечивает общее представление сканирования значений контейнера. Синтаксис для создания вектора с итератором следующий:
Это создает вектор для диапазона [первый, последний) с использованием указанного распределителя, который будет обсуждаться позже в этой статье.
Уничтожение вектора
Чтобы уничтожить вектор, просто позвольте ему выйти из области видимости, и уничтожение будет выполнено автоматически.
Емкость вектора
size_type capacity () const noexcept
Общее количество элементов, которые вектор может содержать без перераспределения, возвращается функцией-членом емкости. Сегмент кода для этого выглядит следующим образом:
vector float > vtr ( 4 ) ;
int num = vtr. capacity ( ) ;
cout num ‘ \n ‘ ;
reserve(n)
Пространство памяти не всегда доступно. Дополнительное место можно зарезервировать заранее. Рассмотрим следующий фрагмент кода:
vector float > vtr ( 4 ) ;
vtr. reserve ( 6 ) ;
cout vtr. capacity ( ) ‘ \n ‘ ;
Результатом будет 6. Таким образом, зарезервировано дополнительное пространство 6 — 4 = 2 элемента. Функция возвращает void.
size () const noexcept
Это возвращает количество элементов в векторе. Следующий код иллюстрирует эту функцию:
vector float > vtr ( 4 ) ;
float sz = vtr. size ( ) ;
cout sz ‘ \n ‘ ;
shrink_to_fit()
После предоставления дополнительной емкости вектору с помощью функции reserve () размер вектора можно уменьшить, чтобы он соответствовал его исходному размеру. Следующий код иллюстрирует это:
vector float > vtr ( 4 ) ;
vtr. reserve ( 6 ) ;
vtr. shrink_to_fit ( ) ;
int sz = vtr. size ( ) ;
cout sz ‘ \n ‘ ;
На выходе будет 4, а не 6. Функция возвращает void.
resize(sz), resize(sz,c)
Это изменяет размер вектора. Если новый размер меньше старого, то элементы ближе к концу стираются. Если новый размер больше, то ближе к концу добавляется какое-то значение по умолчанию. Чтобы добавить определенную ценность, используйте функцию resize () с двумя аргументами. Следующий фрагмент кода иллюстрирует использование этих двух функций:
New size of vtr1: 2
vtr2: 1.1 2.2 8.8 8.8
Функции возвращают void.
empty() const noexcept
Эта функция возвращает 1 для истины, если в векторе нет элементов, и 0 для false, если вектор пуст. Если вектор имеет 4 местоположения для определенного типа данных, например, с плавающей запятой, без какого-либо значения с плавающей запятой, то этот вектор не является пустым. Следующий код иллюстрирует это:
vector float > vtr ;
cout vtr. empty ( ) ‘ \n ‘ ;
vector float > vt ( 4 ) ;
cout vt. empty ( ) ‘ \n ‘ ;
Доступ к элементу вектора
Вектор может быть подписан (проиндексирован) как массив. Подсчет индекса начинается с нуля.
vectorName[i]
Операция «vectorName [i]» возвращает ссылку на элемент в i- м индексе вектора. Следующий код выводит 3.3 для указанного выше вектора:
vectorName [i] const
Операция «vectorName [i] const» выполняется вместо «vectorName [i]», когда вектор является постоянным вектором. Эта операция используется в следующем коде:
Выражение возвращает постоянную ссылку на i- й элемент вектора.
Присвоение значения с помощью нижнего индекса
Значение может быть присвоено непостоянному вектору следующим образом:
На выходе получается 8.8.
vectorName.at (i)
«VectorName.at (i)» похож на «vectorName [i]», но «vectorName.at (i)» более надежен. Следующий код показывает, как следует использовать этот вектор:
vectorName.at (i) const
«VectorName.at (i) const» похоже на «vectorName [i] const», но «vectorName.at (i) const» более надежен. «VectorName.at (i) const» выполняется вместо «vectorName.at (i)», когда вектор является постоянным вектором. Этот вектор используется в следующем коде:
Присвоение значения с помощью функции at ()
Значение может быть присвоено непостоянному вектору с помощью функции at () следующим образом:
На выходе получается 8.8.
Проблема с подпрограммами
Проблема с дополнительными сценариями (индексированием) заключается в том, что если индекс выходит за пределы допустимого диапазона, может быть возвращен ноль или может возникнуть ошибка во время выполнения.
front()
Это возвращает ссылку на первый элемент вектора без удаления элемента. Результатом следующего кода является 1.1.
Элемент не удаляется из вектора.
front() const
Когда конструкции вектора предшествует const, выражение «front () const» выполняется вместо «front ()». Это используется в следующем коде:
Возвращается постоянная ссылка. Элемент не удаляется из вектора.
back()
Это возвращает ссылку на последний элемент вектора без удаления элемента. Вывод следующего кода — 4.4.
back() const
Когда конструкции вектора предшествует const, выражение «back () const» выполняется вместо «back ()». Это используется в следующем коде:
Возвращается постоянная ссылка. Элемент не удаляется из вектора.
Доступ к векторным данным
data() noexcept; data() const noexcept;
Любой из них возвращает указатель, такой что [data (), data () + size ()) — является допустимым диапазоном.
Подробнее об этом будет рассказано позже в статье.
Возвращение итераторов и вектора
Итератор похож на указатель, но имеет больше функций, чем указатель.
begin() noexcept
Возвращает итератор, указывающий на первый элемент вектора, как в следующем сегменте кода:
На выходе получается 1.1. Обратите внимание, что объявление, которое получает итератор, было объявлено. Итератор разыменовывается в возвращаемом выражении для получения значения так же, как разыменование указателя.
begin () const noexcept;
Возвращает итератор, указывающий на первый элемент вектора. Когда конструкции вектора предшествует константа, выражение «begin () const» выполняется вместо «begin ()». При этом условии соответствующий элемент в векторе не может быть изменен. Это используется в следующем коде:
На выходе получается 1.1. Обратите внимание, что на этот раз был использован «const_iterator» вместо простого «итератора» для получения возвращенного итератора.
end() noexcept
Возвращает итератор, который указывает сразу за последним элементом вектора. Рассмотрим следующий фрагмент кода:
Результатом будет 0, что бессмысленно, поскольку за последним элементом нет конкретного элемента.
end() const noexcept
Возвращает итератор, который указывает сразу за последним элементом вектора. Когда конструкции вектора предшествует «const», выражение «end () const» выполняется вместо «end ()». Рассмотрим следующий фрагмент кода:
Результатом будет 0. Обратите внимание, что на этот раз был использован «const_iterator» вместо простого «итератора» для получения возвращенного итератора.
Обратная итерация
Возможно иметь итератор, который выполняет итерацию от конца до самого первого элемента.
rbegin() noexcept
Возвращает итератор, указывающий на последний элемент вектора, как в следующем сегменте кода:
Обратите внимание, что объявлено объявление, получающее обратный итератор. Итератор разыменовывается в возвращаемом выражении для получения значения так же, как разыменование указателя.
rbegin () const noexcept;
Возвращает итератор, указывающий на последний элемент вектора. Когда конструкции вектора предшествует «const», выражение «rbegin () const» выполняется вместо «rbegin ()». При этом условии соответствующий элемент в векторе не может быть изменен. Эта функция используется в следующем коде:
Обратите внимание, что на этот раз был использован const_reverse_iterator вместо только reverse_iterator для получения возвращенного итератора.
rend () noexcept
Возвращает итератор, который указывает непосредственно перед первым элементом вектора. Рассмотрим следующий фрагмент кода:
Результатом будет 0, что не имеет смысла, поскольку непосредственно перед первым элементом нет конкретного элемента.
rend () const noexcept
Возвращает итератор, который указывает непосредственно перед первым элементом вектора. Когда конструкции вектора предшествует «const», выражение «rend () const» выполняется вместо «rend ()». Рассмотрим следующий фрагмент кода:
Обратите внимание, что на этот раз был использован const_reverse_iterator вместо только reverse_iterator для получения возвращенного итератора.
Векторные модификаторы
Модификатор, изменяющий вектор, может принимать или возвращать итератор.
a.emplace (p, args)
Вставляет объект типа T, созданный с помощью std :: forward (args)… перед p.
insert(iteratorPosition, value)
Вставляет копию значения в позицию итератора вектора. Возвращает итератор (позицию) в векторе, куда была помещена копия. Следующий код показывает, где было размещено значение:
Обратите внимание, что итератор был расширен (увеличен) точно так же, как указатель.
Также можно вставить список инициализаторов, как показано в следующем коде:
cout vtr [ 1 ] ‘ ‘ vtr [ 2 ] ‘
‘ vtr [ 3 ] ‘ ‘ vtr [ 4 ] ‘ \n ‘ ;
erase(position)
Удаляет элемент в позиции, на которую указывает итератор, затем возвращает позицию итератора. Следующий код иллюстрирует это:
push_back(t), push_back(rv)
Используется для добавления одного элемента в конец вектора. Используйте push_back (t) следующим образом:
pop_back()
Удаляет последний элемент, не возвращая его. Размер вектора уменьшается на 1. Следующий код иллюстрирует это:
a.swap(b)
Два вектора можно поменять местами, как показано в следующем фрагменте кода:
cout «vtr2: « vtr2 [ ] » « vtr2 [ 1 ] »
« vtr2 [ 2 ] » « vtr2 [ 3 ] ‘ \n ‘ ;
Обратите внимание, что длина вектора при необходимости увеличивается. Кроме того, значения, для которых не было замен, заменяются некоторым значением по умолчанию.
clear()
Удаляет все элементы из вектора, как показано в следующем сегменте кода:
Операторы равенства и отношения для векторов
The == Operator
Возвращает 1 для истины, если два вектора имеют одинаковый размер и соответствующие элементы равны; в противном случае он возвращает 0 для ложного. Например:
Возвращает 1 для истины, если два вектора не имеют одинакового размера и / или соответствующие элементы не равны; в противном случае он возвращает 0 для ложного. Например:
Как инициализировать std : vector в C++ с примерами?
Векторы кажутся контейнерами последовательностей, которые содержат массивы, размер которых может увеличиваться или уменьшаться. В результате нам не нужно определять его длину при объявлении, и мы можем изменить ее позже в скрипте. Мы можем гибко изменять размер std :: vector во время выполнения программы в соответствии с нашими требованиями, в отличие от std :: array, размер которого устанавливается в момент создания и остается неизменным до времени компиляции. Мы не знаем размер массива до момента сборки в этих ситуациях (пока машина компилирует программу). std :: vector здесь очень удобен.
Синтаксис
Синтаксис определения std :: vector аналогичен синтаксису std :: array, за исключением того, что вам не нужно указывать размер массива вместе с типом данных, как можно увидеть здесь.
Давайте начнем, чтобы получить четкое представление о станде :: вектор в C языке. Изначально от нас требовалось открыть систему Ubuntu 20.04. После этого, вам необходимо войти в систему из него первым, а затем откройте приложение терминала консоли, чтобы начать работать с помощью Ctrl + Alt + T. Убедитесь, что у вас установлен пакет компилятора языка C ++ в системе Ubuntu 20.04, потому что без него мы не сможем выполнить наш код. Если у вас его нет, установите компилятор G ++ с помощью приведенной ниже команды после обновления вашей системы и ее пакета apt:
Пример 1
Теперь ваша система готова к использованию. В нашем первом примере был бы пустой вектор, а затем добавляемые значения запускались одно за другим. Используя оболочку терминала, мы должны создать новый файл, чтобы добавить в него код. Убедитесь, что вы создали файл с расширением «.cc », представляющий код C ++. Следовательно, мы создали файл с именем » main.cc «, чтобы добавить в него код C ++ с помощью инструкции „touch“ следующим образом:
По умолчанию файл добавлен в основной каталог нашей системы. Вы можете открыть его оттуда или напрямую через терминал, используя любой редактор. Следовательно, мы использовали редактор GNU Nano, чтобы открыть его с помощью указанного ниже запроса.
Теперь файл открыт в редакторе, вставьте в него код, показанный ниже. Этот код содержит стандартную библиотеку ввода-вывода и поддержку языка c. После этого мы объявили в нем пространство имен. Основная функция инициализирована. Мы объявили пустой вектор целочисленного типа с именем » var «, размер которого не указан в основном методе. После этого мы использовали встроенный метод push_back () для добавления значений в вектор » var » одно за другим. Затем мы объявили цикл «for», чтобы получить значения вектора » var » и распечатать их в оболочке. Нажмите » Ctrl + S «, чтобы сохранить код, и » Ctrl + X «, чтобы выйти из файла и вернуться в терминал.
Итак, вам нужно сначала скомпилировать код файла, чтобы выполнить его в оболочке. Следовательно, для этого используйте установку g ++ вместе с именем файла main.cc в запросе:
Компиляция прошла успешно, ошибок нет. Следовательно, выполните свой файл с запросом » a.out «, как показано ниже. Вывод покажет вам три числа, которые были помещены в вектор «var».
Пример 2
В этом примере мы инициализируем размер вектора, а также его значение. Поэтому откройте файл main.cc еще раз, чтобы обновить наш предыдущий код.
Теперь файл открыт, обновите свой код, как показано ниже. Общий код такой же, за исключением того, что мы инициализировали целочисленную переменную «p» значением 5. Эта переменная будет использоваться в качестве размера вектора в следующих строках кода. В следующей строке мы использовали «p» в качестве размера вектора и значение «15» в качестве его значения. Это означает, что на выходе должно быть значение 15,5 раз. И снова цикл «for» используется для вывода значений вектора в оболочку. Сохраните свой код и оставьте файл main.cc.
Снова скомпилируйте файл обновления, чтобы внести изменения, используя компилятор g ++, как показано ниже. После компиляции запустите ваш файл, используя запрос «a.out». Вы можете наблюдать, как он отображает значение 15 пять раз в оболочке.
Пример 3
Мы также можем объявить вектор, как мы объявляем массив. Это означает, что мы можем присваивать значения вектору в его объявлении. Следовательно, в этом примере мы обсудим, как это сделать. Итак, откройте документ main.cc из домашнего каталога с помощью редактора GNU в оболочке, как показано в запросе ниже.
После того, как файл был открыт, вставьте в него код, добавленный ниже. Вы можете видеть, что код сравним с предыдущим, так как мы его особо не меняли. Изменение касается только строки оператора вектора. Мы инициализировали вектор вместе со значениями в нем, например, «100», «200» и «300» как массив. Затем мы использовали цикл for для вывода этих значений вектора в оболочку. После завершения кода сохраните файл и перейдите к оболочке терминала.
Компиляция и выполнение файла будут выполняться с использованием тех же предыдущих команд.
Пример 4
Вышеупомянутый пример был о добавлении значений к вектору, как мы это делаем в массиве. На этот раз у нас будет вектор, который будет инициализирован из некоторого массива. Снова откройте файл в редакторе для обновления.
Мы инициализировали массив «A» в основном методе с 5 значениями в нем. Целое число p использовалось для получения целочисленных значений из размера массива. Вектор был инициализирован при использовании массива «A» в качестве его значения вместе с целым числом p.
Пример 5
Вы также можете инициализировать некоторый вектор из другого вектора. Для этого мы обновим наш код, открыв тот же файл.
Мы объявили вектор целочисленного типа var1 с некоторыми значениями целочисленного типа в основной функции. Затем мы объявили еще один вектор целочисленного типа, но не дали ему прямых значений, как обычно. Мы использовали начать () и » конец метод» с именем вектора 1: » var1 «, чтобы добавить значения вектора 2: » var2 «. Когда мы напечатали вектор 2 в цикле » for «, он работает довольно хорошо.
Код работает нормально, как показано на картинке.
Пример 6
В этом примере мы будем использовать другой метод для инициализации вектора std. Снова откройте файл через консоль оболочки, как показано ниже.
Мы объявили вектор » var1 ″ размером 100 с помощью оператора » std :: «. Инициализировано целое число со значением 5. Мы использовали метод » fill » для добавления значений в вектор » var1 ″. Цикл For был снова использован для вывода значений.
Вы можете видеть, что результат показывает, что были отображены 100 значений.
Заключение
Вы закончили почти все иллюстрации векторов в системе Ubuntu 20.04. Обязательно реализуйте все необходимые примеры, чтобы получить практический опыт.