Что такое векторы и как они используются в программировании? - PullRequest
36 голосов
/ 03 февраля 2009

Я знаком с математической / физической концепцией вектора как величины и направления, но я также продолжаю сталкиваться со ссылками на векторы в контексте программирования (например, в C ++, похоже, есть библиотека stl :: vector что довольно часто встречается на SO).

Моя интуиция из контекста заключалась в том, что это довольно примитивная конструкция, наиболее часто используемая для представления чего-либо вдоль линий массива переменной длины (я полагаю, что его размер равен величине), но это было бы очень полезно если бы кто-нибудь мог дать мне более полное объяснение, предпочтительно, включая то, как и почему они используются на практике.

Ответы [ 11 ]

39 голосов
/ 03 февраля 2009

С http://www.cplusplus.com/reference/stl/vector/

Векторные контейнеры реализованы как динамические массивы; Как обычно массивы, векторные контейнеры имеют свои элементы хранятся в непрерывном хранилище места, что означает, что их элементы могут быть доступны не только используя итераторы, но и смещения на регулярных указателях на элементы.

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

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

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

Компромисс для изменения размера заключается в том, что при достижении текущей емкости он должен перераспределять, а иногда и копировать, больше памяти. Однако большинство алгоритмов увеличения емкости удваивают емкость каждый раз, когда вы сталкиваетесь с барьером, поэтому вы никогда не попадете в нее больше, чем log2 (куча доступна), которая оказывается, пожалуй, в десятки раз в худшем случае за время работы программы.

-Adam

19 голосов
/ 03 февраля 2009

В математике вектор можно рассматривать как комбинацию направления и величины. Тем не менее, это также может рассматриваться как координата. Например, вектор с величиной 5 и углом около 37 градусов от горизонтали представляет точку на 2D-плоскости. Эту точку также можно представить с помощью декартовой пары координат (3, 4). Эта пара (3, 4) также является математическим вектором.

В программировании это имя «вектор» изначально использовалось для описания любой последовательности скалярных чисел фиксированной длины. Вектор длины 2 представляет точку в 2D-плоскости, вектор длины 3 представляет точку в 3D-пространстве и так далее. Вектор длины 100 представляет точку в 100-мерном пространстве (математики без труда думают о таких вещах).

В современных библиотеках программирования это название "вектор" обычно означает последовательность значений переменной (необязательно числа). Изменение размера (длины или размерности) математического вектора - это не то, что вы обычно делаете, если не выполняете какую-либо операцию проецирования. Но изменение длины вектора программирования, который содержит последовательность строк, может быть обычной операцией.

7 голосов
/ 03 февраля 2009

Математические векторы, к которым вы привыкли, являются тензорами ранга один ; структуры данных в информатике не обязательно подчиняются правилам тензорного преобразования. Это просто массивы, которые могут расширяться и сжиматься, как отмечалось ранее.

4 голосов
/ 03 февраля 2009

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

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

Векторы хороши в:

  • Доступ к отдельным элементам по их индексу позиции (постоянному времени).
  • Перебор элементов в любом порядке (линейное время).
  • Добавление и удаление элементов с конца (постоянное время амортизации).

REF

2 голосов
/ 03 февраля 2009

Из книги SICP :

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

2 голосов
/ 03 февраля 2009

Я могу понять вашу путаницу по именам (я тоже был смущен этим). Этому не помогает идея Vector в программировании трехмерной графики, которая ближе к математическому определению. В математике Вектор можно рассматривать как одномерную матрицу произвольной длины (длина - это число измерений вашей системы координат). В большинстве ОО-языков векторы являются по существу одномерными матрицами (массивами), отсюда и название. Они не имеют ничего общего с координатами, если только программист не решит использовать их для этой задачи (что встречается редко - я никогда этого не видел). Они также обычно не имеют математических операторов для умножения матриц или подобных операций. Таким образом, их одномерная природа заключается в том, где заканчивается сходство. Я оставлю это другим ответам, чтобы объяснить функции и использование контейнера OO, с которым у них уже есть ручка.

2 голосов
/ 03 февраля 2009

Поскольку по крайней мере два других ответа вставлены с этого сайта , вы также можете прочитать остальное описание там ...: -)

0 голосов
/ 20 октября 2017

Чтобы помочь вам вспомнить значение CS слова «вектор», может быть полезно обратиться к латинскому корню vehere, что означает «переносить или переносить». Таким образом, вектор несет или содержит вещи, вообще говоря.

0 голосов
/ 21 июля 2017

Помимо структуры данных в C ++, вектор также является термином для указателя на код. F.E. вектор прерывания указывает на код прерывания, который нужно вызвать.

0 голосов
/ 20 марта 2016

Векторы в программировании - это, в основном, динамические массивы, в которых хранилище обрабатывается автоматически, позволяя при необходимости расширять и сокращать его. Лучше всего то, что они также обеспечивают постоянный доступ к отдельным элементам через индекс, как обычный массив .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...