Что такое вектор в программировании какой массив
Перейти к содержимому

Что такое вектор в программировании какой массив

  • автор:

Что такое вектор в программировании какой массив

Вектор — одномерный массив проиндексированных элементов. Вектор представляет собой пример наиболее полного стандартного контейнера. Для использования вектора стандартной библиотеки необходимо подключить файл с описанием вектора. При объявлении вектора (так же и других контейнеров) в треугольных скобках указывается тип данных элементов, хранящихся в векторе. Доступ к элементам вектора можно осуществлять через квадратные скобки, так же как и для обычных массивов.

Доступ к функциям вектора производится через оператор «.». Вектор – это особый тип данных, шаблон класса. Подробнее о классах и шаблонах см. главу 4 и раздел 5.4.

Для вектора не обязательно сразу указывать его размер, размер вектора можно изменить в любом месте программы при помощи функции resize(), а чтобы узнать размер вектора можно воспользоваться функцией size().

#include using namespace std; vectordouble> x; // создание вектора x.resize(10); // изменение размера вектора x.resize(x.size()+100); // изменение размера вектора double sum=0.0; for(int i=0; i//доступ по индексу >

Полный список функций вектора см. Приложение 5.

Рассмотрим более подробно пример работы с вектором. Обратите внимание, что в этом примере вектор передается в функцию по ссылке, т.к. классы и массивы большого объема нерационально копировать каждый раз при вызове функции, что происходит при передачи по значению. Если функция не должна изменить содержимое контейнера, дополнительно указывается ключевое слово const.

///////////////////////////////////////////////////////////////////////////// // Прикладное программирование // Пример 3.3. Пример работы с контейнером vector // // Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru // Университет ИТМО ///////////////////////////////////////////////////////////////////////////// #include // подключение библиотеки ввода-вывода #include // подключение описания вектора #include // для работы с таймером using namespace std; // подключение стандартного пространства имен для использования библиотек // прототипы функций int min(const vectordouble>& data); void fill_rand(vectordouble>& data, double max, double min); ///////////////////////////////////////////////////////////////////////////// // пример передачи вектора в функцию // функция находит индекс минимального числа в векторе int min(const vectordouble>& data) < int index=0; double min=data[0]; for(int i=1; iif(data[i] > return index; > ///////////////////////////////////////////////////////////////////////////// // Функция заполнения вектора случайными числами // data - вектор для заполнения // max - максимальное число случайного диапазона // min - минимальное число случайного диапазона void fill_rand(vectordouble>& data, double max, double min) < // устанавливает стартовую точку для генерации // случайных чисел по текущему времени srand((unsigned) clock()); for(int i=0; i > ///////////////////////////////////////////////////////////////////////////// void main() < vectordouble> x; // создание вектора // ввод количества элементов в векторе int n; cout"input vector size: "; cin>>n; // 1. заполнение контейнера индексами // заполнение контейнера for(int i=0; i// добавить элемент в конец контейнера x.push_back(i); > // вывод всех элементов контейнера cout<for(int i=0; i; //доступ по индексу > // 2. заполнение контейнера случайными числами от 1 до 100 // очистить контейнер x.clear(); // изменить размер x.resize(20); // заполнить случайными числами fill_rand(x, 1, 100); // вывод всех элементов контейнера cout<for(int i=0; i//доступ по индексу > // вывод минимального числа в контейнере cout<// x[min(x)] аналогично записи int i=min(x); x[i]; > /////////////////////////////////////////////////////////////////////////////// 

При работе с вектором мы сталкиваемся с такими понятиями как размер и емкость. Размер — количество элементов, хранимых в контейнере, можно узнать с помощью функции size(), а изменить с помощью resize(). Операции push_back(), insert(), erase() также изменяют размеры вектора. Когда размеры вектора изменяются, то все его элементы могут быть перемещены в новую область памяти, поэтому хранить указатели на элементы вектора не имеет смысла и может быть опасно. Всегда нужно работать через итераторы (см.раздел 3.5).

С помощью функции empty() можно узнать о наличии элементов в контейнере. Если контейнер действительно пуст, то функция возвращает true.

bool res=x.empty(); // эквивалентно x.size() == 0 

При работе с вектором можно выделить (зарезервировать) некоторую область памяти для потенциального расширения. Использование функции reserve() обеспечить выделение памяти для новых элементов контейнера. При этом вставка новых элементов или изменение размеров с помощью resize() не потребует перераспределения хранимого вектора в памяти. Определить «емкость» вектора можно с помощью функции capaсity().

Массивы

Векторы Для использования объектов типа vector необходимо добавить в программу подключение заголовочного файла:

Также в примерах предположим, что в начале программы подключено использование пространства имен std.
using namespace std;

  • Описание вектора
  • Количество элементов
  • Добавление элемента в конец вектора
  • Перебор элементов
  • Вставка элемента в произвольное место
  • Удаление элемента
  • Очистка вектора
  • Выделение памяти

При описании вектора, также как и при описании массива, нужно указать тип элементов, из которых он будет состоять. Количество элементов указывать не обязательно, но такая возможность есть.

vector a; // создать пустой вектор vector b(10); // создать вектор из 10 элементов и заполнить его нулями.

Функция size() возвращает количество элементов в векторе.

vector a; . if (a.size() > 20)

Добавление элемента в конец вектора делается с помощью функции push_back(). При этом размер вектора увеличивается на 1.

vector a; . for (int i = 0; i < 10; i++ < cin >> x; a.push_back(x); >

Данный способ формирования вектора является не самым оптимальным, так как при добавлении нового элемента требуется проверка выделенной памяти и, при необходимости, ее расширение. Если возможно, лучше сразу зарезервировать нужное количество памяти.

Как и в случае с массивом возможен перебор элементов по индексам.

vector a; . for (int i = 0; i ::iterator p; p = a.begin() + 2; // p указывает на 2-й элемент // (при нумерации с 0 — это 3-й от начала) a.insert(p, 5); // получен массив (1 2 5 3 4)

Удаление элемента выполняется с помощью функции erase(). Позиция удаляемого элемента указывается с помощью итератора.

vector a; a.push_back(1); a.push_back(2); a.push_back(3); a.push_back(4); // сформировали массив из чисел (1 2 3 4) vector ::iterator p; p = a.begin() + 1; a.erase(p); // получили массив из чисел (1 3 4)

Функция clear() освобождает память из-под элементов вектора. Размер вектора становится равным нулю.

В чем разница между векторами и массивами?

Всем привет! Начал изучение С++ и столкнулся с вопросом: в чем разница между векторами и массивами в С++?

Отслеживать
задан 19 окт 2021 в 12:32
59 1 1 серебряный знак 5 5 бронзовых знаков

Условно, вектор — это массив, размер которого может изменяться. А вообще, если изучаете, то об этом должно быть сказано в материалах.

19 окт 2021 в 12:36

Какими массивами? Если вы имеете в виду int a[5] , это одно, а если std::array a — то это совсем другое.

19 окт 2021 в 12:40

Не знаю как именно в C++, но судя по другим языкам, с векторами должны быть доступны некие «векторные» операции, когда можно просто и, главное, быстро сложить два вектора, умножить вектор на скаляр и т.д. С массивами же обычно работают поэлементно, и таких специальных быстрых операций для работы с массивом как с целым у них нет.

19 окт 2021 в 12:46

@gbg Угу, раньше сплошь и рядом вектор — это одномерный массив, матрица — двумерный, а всё остальное — просто массив.

19 окт 2021 в 12:50

столкнулся с вопросом: в чем разница между векторами и массивами Открой конспект и посмотри, что по этому вопросу сказал на лекции преподаватель. Любое отклонение от его мнения скорее всего выйдет боком, особенно если на экзамене.

19 окт 2021 в 12:52

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Если отбросить все нестандартные определения и термины, то массив является простейшим составным типом, пришедшим из языка Си. Массив объектов (включая фундаментальные типы) занимает неразрывную область памяти, его элементы являются подобъектами массива, его размер задается в момент создания. Размер массива выраженный в виде числа элементов является частью его типа.

int arr[6]; // Переменная - массив int-ов размером 6 int* allocate(int size) < // dyn_arr присваивается значение указателя на массив заданного размера int *dyn_arr = new int[size]; // выделяется динамически при исполнении return dyn_arr; // возвращается указатель на первый элемент >

Как таковой синтаксис языка Си++ не работает с понятием «вектор». Однако стандарт на язык описывает набор стандартных компонент, к таковым относится std::array и std::vector . Первый является структурой, ведущей себя как массив постоянного размера, за исключением того что она может быть возвращена из функции или передана без развоплощения в указатель на первый элемент. Второй является классом для работы с массивом в динамически выделенной области памяти, позволяющий уменьшать и увеличивать объем выделенной памяти по желанию, что требует перевыделения и копирования содержимого.

Векторы в C++: для начинающих

обложка статьи

Всем привет! До этого дня мы использовали чистые массивы. Чистые — это значит простые массивы, не имеющие у себя в багаже различных функций. В этом уроке мы пройдем нечистые массивы — векторы.

Что такое вектор (vector)

Вектор — это структура данных, которая уже является моделью динамического массива.

Давайте вспомним о том, что для создания динамического массива (вручную) нам нужно пользоваться конструктором new и вдобавок указателями. Но в случае с векторами всего этого делать не нужно. Вообще, по стандарту пользоваться динамическим массивом через конструктор new — не есть правильно. Так как в компьютере могут происходить различные утечки памяти.

Как создать вектор (vector) в C++

Сначала для создания вектора нам понадобится подключить библиотеку — , в ней хранится шаблон вектора.

#include 

Кстати, сейчас и в будущем мы будем использовать именно шаблон вектора. Например, очередь или стек, не созданные с помощью массива или вектора, тоже являются шаблонными.

Далее, чтобы объявить вектор, нужно пользоваться конструкцией ниже:

vector  тип данных > имя вектора>;
  • Вначале пишем слово vector .
  • Далее в угольных скобках указываем тип, которым будем заполнять ячейки.
  • И в самом конце указываем имя вектора.
vector string> ivector;

В примере выше мы создали вектор строк.

Кстати, заполнить вектор можно еще при инициализации (другие способы мы пройдем позже — в методах вектора). Делается это также просто, как и в массивах. Вот так:

vectorint> ivector = элемент[0]>, элемент[1]>, элемент[2]>>;

После имени вектора ставим знак равенства и скобки, в которых через пробел указываем значение элементов.

Такой способ инициализации можно использовать только начиная с C++11!

Так, чтобы заполнить вектор строками, нам нужно использовать кавычки — «строка» .

Второй способ обратиться к ячейке

Мы знаем, что в векторе для обращения к ячейке используются индексы. Обычно мы их используем совместно с квадратными скобками [] .

Но в C++ есть еще один способ это сделать благодаря функции — at(). В скобках мы должны указать индекс той ячейки, к которой нужно обратиться.

Вот как она работает на практике:

vector int> ivector = 1, 2, 3>; ivector.at(1) = 5; // изменили значение второго элемента cout  .at(1); // вывели его на экран

Давайте запустим эту программу:

5 Process returned 0 (0x0) execution time : 0.010 s Press any key to continue.

Как указать количество ячеек для вектора

Указывать размер вектора можно по-разному. Можно это сделать еще при его инициализации, а можно хоть в самом конце программы. Вот, например, способ указать длину вектора на старте:

vector int> vector_first(5);

Так в круглых скобках () после имени вектора указываем первоначальную длину. А вот второй способ:

vector int> vector_second; // создали вектор vector_second.reserve(5); // указали число ячеек

Первая строчка нам уже знакома. А вот во второй присутствует незнакомое слово — reserve , это функция, с помощью которой мы говорим компилятору, какое количество ячеек нам нужно использовать.

Вы можете задать логичный вопрос: “А в чем разница?“. Давайте создадим два вектора и по-разному укажем их количество ячеек.

#include #include // подключили библиотеку using namespace std; int main()  setlocale(0, ""); vector int> vector_first(3); // объявили // два vector int> vector_second; // вектора vector_second.reserve(3); cout  <"Значения первого вектора (с помощью скобок): "; for (int i = 0; i  3; i++)  cout  [i]  <" "; > cout  <"Значения второго вектора (с помощью reserve): "  ; for (int i = 0; i  3; i++)  cout  [i]  <" "; > system("pause"); return 0; >
Значения первого вектора (с помощью скобок): 0 0 0 Значения второго вектора (с помощью reserve): 17 0 0 Process returned 0 (0x0) execution time : 0.010 s Press any key to continue.

Как видим, в первом случае мы вывели три нуля, а во втором: 17, 0, 0.

Все потому, что при использовании первого способа все ячейки автоматически заполнились нулями.

При объявлении чего-либо (массива, вектора, переменной и т.д) мы выделяем определенное количество ячеек памяти, в которых уже хранится ненужный для ПК мусор. В нашем случае этим мусором являются числа.

Поэтому, когда мы вывели второй вектор, в нем уже находились какие-то рандомные числа — 17, 0, 0. Обычно они намного больше. Можете кстати попробовать создать переменную и вывести ее значение.

Нужно помнить! При использовании второго способа есть некоторый плюс — по времени. Так как для первого способа компилятор тратит время, чтобы заполнить все ячейки нулями.

Как сравнить два вектора

Если в середине программы нам понадобится сравнить два массива, мы, конечно, используем цикл for и поочередно проверим все элементы.

Вектор опять на шаг впереди! Чтобы нам сравнить два вектора, потребуется применить всего лишь оператор ветвления if.

if (vec_first == vec_second)  // сравнили! cout  <"Они равны!"; > else  cout  <"Они не равны"; >

Конечно, компилятор все равно прогонит эти два вектора по циклу, проверяя ячейки. Но оцените, насколько благодаря этому программа стала компактнее. Разве это не прекрасно?

Вот так бы выглядела программа выше, если бы мы не использовали знак равенства для векторов.

bool flag = true; if (vec_first.size() == vec_second.size())  for (int i = 0; i  vec_first.size(); i++)  if (vec_first[i] != vec_second[i])  cout  <"Они не равны!"; flag = false; break; // выходим из цикла > > > else  flag = false; cout  <"Они не равны!"; > if (flag)  cout  <"Они равны!"; > 
  1. Сначала мы создали булеву переменную flag равную true . У нее задача такая:
    • Если в условии (строки 5 — 10) она станет равна false — то значит эти векторы не равны и условие (строки 14 — 16) не будет выполняться.
    • Если же она после цикла (строки 3 — 12) останется равна true — то в условии (строки 14 — 16) мы сообщим пользователю, что они равны.
  2. В условии (строка 3) проверяем размеры двух векторов на равенство.
  3. И если условие (строки 5 — 10) будет равно true — то мы сообщим пользователю, что эти два вектора не равны.

Как создать вектор векторов

Понятно, что вам может понадобиться записать числа в двумерный массив. Но зачем использовать массив, если можно оперировать векторами.

Сейчас вы узнаете, как создать вектор векторов или простым языком массив векторов.

vector  vector  тип данных > >;

Как можно увидеть, нам пришлось только добавить слова vector и еще его .

А чтобы указать количество векторов в векторе, нам потребуется метод resize() .

vector  vector int> > vec; vec.resize(10); // десять векторов

Но есть еще одни способ добавления векторов в вектор. Для этого способа мы будем использовать функцию push_back() (читайте ниже, что она делает).

vec.push_back(vector int>());
  • В аргументах функции push_back() находится имя контейнера, который мы хотим добавить. В нашем случае — vector .
  • А дальше идет тип контейнера — .
  • И все заканчивается отрывающей и закрывающей скобкой () .

Для двумерного вектора тоже можно указать значения еще при инициализации:

vector  vector int> > ivector = 1, 4, 7>, 2, 5, 8>, 3, 6, 9>>;

— это значения элементов первого массива (первого слоя). Такие блоки значений, как , должны разделяться запятыми.

Методы для векторов:

Сейчас мы разберем некоторые методы, которые часто используются вместе с векторами. Метод — это функция, которая относится к определенному STL контейнеру.

В нашем случае этим STL контейнером является вектор. Если вы дальше собираетесь оперировать векторами — лучше все перечисленные функции запомнить.

Если нам требуется узнать длину вектора, понадобится функция — size() . Эта функция практически всегда используется вместе с циклом for.

for (int i = 0; i  ivector.size(); i++)  // . >

Также, если нам требуется узнать пуст ли стек, мы можем использовать функцию — empty() .

  • При отсутствии в ячейках какого-либо значения это функция возвратит — true .
  • В противном случае результатом будет — false .

Вот пример с ее использованием:

if (ivector.empty())  // . >

2) push_back() и pop_back()

Как мы сказали выше, у векторов имеются методы, которые помогают оптимизировать и улучшить жизнь прог

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *