Почему вектор C ++ называется вектором?


147

Вопрос довольно очевиден. Я немного знаю о векторах в математике, но на самом деле не вижу связи с векторами C ++.


5
Векторы (направление Magnitute +) в физике - это первое, что приходит мне в голову, когда я слышу слово векторов.
RBT

Ответы:


109

Математическое определение вектора является членом набора Sn, который представляет собой упорядоченную последовательность значений в конкретном наборе ( S). Это то, что vectorхранит C ++ .


21
Векторы обычно считаются 2-3-мерными из-за их использования в физике. Но в более общем смысле в математике они просто означают набор чисел, имеющий порядок (математические наборы являются беспорядочными, они похожи на мешок, наполненный вещами). Вектор может иметь любое количество элементов.
Джозеф Гарвин

8
vartec, нельзя ли представить евклидов вектор как координатный вектор и наоборот? Это просто разные представления одной и той же вещи (кортежа) в евклидовом пространстве по сравнению с более общим векторным пространством.
Calvin

6
@ Джозеф Гарвин: Векторы даже не должны иметь числовые компоненты. Например, определенные наборы функций могут использоваться для формирования векторных пространств, где компоненты являются функциями.
Джейсон

13
Вектор буквально является «носителем». Это же слово используется для (например) насекомых, передающих болезнь, и происходит от того же латинского корня, что и «проводник». Так что это то, что переносит вас из одного места в другое. Кстати, слово «матрица» также происходит от латинского, что означает «матка».
Артелий

7
Это кажется неудовлетворительным , так как : 1. Математические векторы не изменяются в размерности, 2. Математические векторы имеют операции , которые std::vectorне обеспечивают, 3. Аргумент , что std::vectorпредставляет собой упорядоченную последовательность значений может применяться к std::list, std::deque, std::basic_stringи т.д.
jamesdlin

190

Он называется вектором, потому что Алекс Степанов, дизайнер библиотеки стандартных шаблонов, искал имя, чтобы отличать его от встроенных массивов. Теперь он признает, что совершил ошибку, потому что математика уже использует термин «вектор» для последовательности чисел фиксированной длины. C ++ 11 усугубляет эту ошибку, вводя класс «массив», который ведет себя подобно математическому вектору.

Урок Алекса: будь очень осторожен каждый раз, когда ты что-то называешь.


1
Но массив также не будет использовать выделение кучи, что сделает его перемещение менее эффективным. У нас также есть std :: valarray, кстати.
Sellibitze

1
Вы можете выделить его в кучу, если дешевый ход желателен.

2
Приятно знать, что они усвоили этот урок, хотя уже слишком поздно. Хотя ... typedef или #define тоже могут это исправить.
LearnCocos2D

4
В компьютерных науках есть только две сложные вещи: аннулирование кэша и присвоение имен - Фил Карлтон
RBT

8
если вы собираетесь в своем ответе заявить «[Алексей Степанов] признает, что совершил ошибку», не могли бы вы привести цитату?
Тревор Бойд Смит

56

Отрывок из языка программирования C ++ Бьярна Страуструпа:

«Можно утверждать, что valarray должен был называться vector, потому что это традиционный математический вектор, а этот вектор должен называться массивом . Однако терминология развивалась не так».


51
Пффтт .. что этот парень знает. Я никогда не слышал об этом "Бьярне Страуструпе".
Calvin

5
Мне просто интересно, сколько из голосов предыдущего комментария на самом деле является результатом
недостаточного потока

16

Название происходит от линейной алгебры, где вектор - это матрица с одним столбцом или только одной строкой.


10

Просто чтобы сказать, почему это, вероятно, не называется array: Потому что std::vectorимеет динамический размер. Массив концептуально фиксирован по длине. Кстати, у следующего C ++ Standard есть std::arrayшаблон, который имеет фиксированный размер и должен быть предпочтительнее простого массива:

std::array<int, 4> f = { 1, 2, 3, 4 };

Этот новый стандарт C ++ уже выпущен?
Йоханнес Йенсен

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

@ Кай, я думаю, здесь есть путаница. Я просто аргументировал, почему он не называется массивом . Я не пытался объяснить, почему он специально называется вектором . Массив в C ++ даже до стандартизации языка всегда имел фиксированный размер, поэтому присвоение имени изменяемому классу std::arrayбыло бы бесполезным.
Йоханнес Шауб -

Теперь вы можете справедливо жаловаться, что это не большой ответ, а действительный комментарий. Поскольку я согласен с первой половиной предложения (до запятой) вашего комментария. Однако сейчас уже слишком поздно переносить мой ответ в комментарий к вопросу, потому что эти полезные комментарии вас и @ user12 будут потеряны.
Йоханнес Шауб -

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

10

Чтобы дополнить отличный ответ от @MarkRuzon:

Алекс сказал, что, чтобы дать имя тому, что сейчас называется std :: vector, он заметил имя, которое Scheme и Common Lisp дали аналогичным структурам данных.

Позже он признает, что был неправ, потому что вектор C ++ не имеет ничего общего с векторами в математике.

Он также говорит, что допустил ошибку сообщества из 50 человек в сообществе из 5 миллионов человек, поэтому ошибка, вероятно, останется навсегда.


5

Это просто имя. Вектор C ++ вполне можно (или, может быть, даже более точно) назвать динамическим массивом или массивом с изменяемым размером, но это имя было просто выбрано . Этот вектор не совпадает с вектором из математики, потому что в математике векторы являются членами любого множества V , так что в этом множестве определены две важные операции : + (сложение векторов) и x (умножение вектора на скаляр из поля F ) и эти операции удовлетворяют 8 аксиомам :


Ассоциативность сложения

u + (v + w) = (u + v) + w

Коммутативность сложения

U + V = V + U

Элемент идентичности сложения

Там существует элемент 0 ∈ V , называется нулевой вектор , такой , что у + 0 = v для всех V ∈ V .

Обратные элементы сложения

Для каждого v ∈ V существует элемент −v ∈ V , называемый аддитивной инверсией v, такой что v + (−v) = 0

Совместимость скалярного умножения с полевым умножением

a (bv) = (ab) v

Элемент идентичности скалярного умножения

1 V = V, где 1 обозначает мультипликативный идентичность в F .

Распределенность скалярного умножения относительно сложения векторов  

a (u + v) = au + av

Распределенность скалярного умножения относительно сложения полей

(a + b) v = av + bv


C ++ std::vectorподдерживает все из них (не напрямую, а через функции C ++), поэтому его можно как-то назвать вектором, но это просто разговорный подход, например, на который Vallarayуказал Бьярн Страуструп в «Языке программирования C ++», некоторые из них поддерживаются напрямую.


3
Ни один контейнер в C ++ не имеет такой арифметики, поэтому в C ++ нет векторов. В частности, a std::vectorне поддерживает арифметические операции, и поэтому все эти свойства не определены для a std::vector. Таким образом, a std::vectorне квалифицируется как вектор. Я бы назвал это dynamic_arrayили resizable_arrayкоторый говорит вам, что это такое.
user877329

4
Или просто «список». Но нееееет ... это должен был быть "вектор", потому что это то, что все используют, верно?
LearnCocos2D

1
@ LearnCocos2D, ну, обычно под списком понимается связанный список. На самом деле, в стандартной библиотеке C ++ уже есть контейнер с именем list - это двусвязный список.
Андрей

3

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


В линейной алгебре, откуда в математике происходит «вектор», все касается операций, причем все векторы имеют одинаковый размер. Линейная алгебра, так что операции , это то, что делает группу чисел вектором в математике.
E4z9

3

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


это явно ложно, это не то, что вектор en.wikipedia.org/wiki/Vector_space
sara

@kai Вы найдете эти конфликты и в других областях. Вещественные числа в некоторых языках программирования не смогут храниться 0.1, тогда как в математике это значение является членом набора действительных чисел. На языке программирования Java ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ) вектор имеет вид «Класс Vector реализует растущий массив объектов. Как и массив, он содержит компоненты, которые можно получить с помощью целочисленного индекса. Однако размер вектора может увеличиваться или уменьшаться по мере необходимости, чтобы приспособить добавление и удаление элементов после того, как вектор был создан. "
Йоханнес Шауб -

Что же касается того, что вектор является , это зависит от того , определение вы используете. Поскольку этот вопрос задавался на stackoverflow.com , а не на math.stackexchange.com , я бы поспорил с менее математическим подходом.
Йоханнес Шауб -

@kai Я хорошо знаком с определением вектора в отношении векторных пространств. Я также знаком с определениями информатики, где вектор - это просто список чисел, смежных в памяти, то есть массив. Обратите внимание, что на странице неоднозначности для вектора в википедии, они показывают, что одно значение - это одномерный массив. Это в точности то же самое значение, которое используется для векторных процессоров, которые были примерно с 70-х годов. Поэтому, хотя определение, которое я дал, не является строгим математическим определением, это определение информатики, хотя и более старое.
Джеймс Матта

3

Давным-давно в языке B существуют векторные типы. Тогда язык C назвал их «массивами». Тогда C с классами и языком C ++ просто выводят его ...

Это, конечно, не вся история. Как уже упоминалось выше, Степанов принял фактическое решение. Но если «вектор» все еще использовался в C, результат может выглядеть совсем иначе.

PS. Интересно, почему C переименовывает в «массив». Какова была точная причина?

PS2. IMO для языка как C ++, массив лучше означает «тип содержит элементы, к которым разумно обращаться через оператор []» (т.е. не 42 [some_array_object]), например, создание экземпляра std :: map в качестве «ассоциативного массива».


2

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


2

но математические векторы не являются динамическими, я никогда не видел, чтобы одно изменение из 2D в 3D или что-то еще, если что-то традиционное делает массивы для лучших векторов.


Конечно, математические векторы рассматриваются во многих измерениях. Если под динамикой вы подразумеваете, что вектор меняет свой размер, он может легко соответствовать математическому «рассмотреть этот вектор в измерении x» путем добавления или усечения координат. Простое линейное преобразование может отображать векторы из n-dim-пространства в векторы в m-dim-пространстве. Математические векторы ОЧЕНЬ динамичны.
4pie0

1

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


1

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

Векторы в математике

Рассмотрим nxmматрицу с именем A, где nсоответствует числу строк и mсоответствует количеству столбцов. В математическом контексте, если вы введете такую ​​матрицу, то позже вы не сможете выполнять никаких операций за пределами Aдиапазона и не можете расширять Aразмер. Это означает, что вы не можете ссылаться на индекс [n + 1]и / или [m + 1].

Теперь вектор также Aполучает эти атрибуты, в то время как их размеры всегда будут 1xm(любая [i]выбранная строка A) или nx1(любая [j]выбранная колонка A). Вектор также не может быть указан как 2xn, потому что набор векторов нельзя интерпретировать как один вектор, а один вектор - пусть это будет [i]вектор-столбец Aс размерами 1xm- можно интерпретировать как матрицу.

Важным выводом является то, что вы не можете изменить размеры вектора, если он введен с точки зрения математики.

Векторы в C ++

В C ++ векторы аналогичны векторам в математике, но в отличие от математики их размер может быть изменен . Размер как термин применяется здесь, потому что он подразумевает количество элементов, которое содержит один конкретный вектор.

Вы можете использовать термин размеры в терминах векторов C ++, если у вас есть вектор векторов: std::vector<std::vector<T>>> ragged_array. В этом примере я назвал этот вектор «рваным», потому что он демонстрирует, как размер каждого вектора этого вектора можно изменять независимо. Это не только нарушает правила того, как размеры не могут быть изменены после введения определенного вектора в математику, но также демонстрирует, как его нельзя использовать в качестве матрицы.


0

Интересно, что параметризация по типам делает с именами ..

здесь столбец взорван .. (см. источник для некоторых навыков кодирования HTML на стороне сервера ASP.NET)

или это был скандал?

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


-2

это происходит из структуры матрицы, которая строится из векторов

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.