Почему вектор C ++ называется вектором? - PullRequest
128 голосов
/ 24 февраля 2009

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

Ответы [ 16 ]

167 голосов
/ 17 апреля 2009

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

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

101 голосов
/ 24 февраля 2009

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

49 голосов
/ 24 февраля 2009

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

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

15 голосов
/ 24 февраля 2009

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

9 голосов
/ 24 февраля 2009

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

std::array<int, 4> f = { 1, 2, 3, 4 };
6 голосов
/ 10 января 2014

В дополнение к отличному ответу @MarkRuzon:

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

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

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

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

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

3 голосов
/ 19 мая 2014

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


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

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

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

u + v = v + u

Идентификационный элемент сложения

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

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

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

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

a (bv) = (ab) v

Идентификационный элемент скалярного умножения

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

Дистрибутивность скалярного умножения относительно сложения векторов

a (u + v) = au + av

Дистрибутивность скалярного умножения относительно сложения полей

(a + b) v = av + bv


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

3 голосов
/ 19 мая 2014

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

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

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

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

3 голосов
/ 24 февраля 2009

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

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