Вопрос довольно очевиден. Я немного знаю о векторах в математике, но на самом деле не вижу связи с векторами C ++.
Вопрос довольно очевиден. Я немного знаю о векторах в математике, но на самом деле не вижу связи с векторами C ++.
Ответы:
Математическое определение вектора является членом набора S
n
, который представляет собой упорядоченную последовательность значений в конкретном наборе ( S
). Это то, что vector
хранит C ++ .
std::vector
не обеспечивают, 3. Аргумент , что std::vector
представляет собой упорядоченную последовательность значений может применяться к std::list
, std::deque
, std::basic_string
и т.д.
Он называется вектором, потому что Алекс Степанов, дизайнер библиотеки стандартных шаблонов, искал имя, чтобы отличать его от встроенных массивов. Теперь он признает, что совершил ошибку, потому что математика уже использует термин «вектор» для последовательности чисел фиксированной длины. C ++ 11 усугубляет эту ошибку, вводя класс «массив», который ведет себя подобно математическому вектору.
Урок Алекса: будь очень осторожен каждый раз, когда ты что-то называешь.
Отрывок из языка программирования C ++ Бьярна Страуструпа:
«Можно утверждать, что valarray должен был называться vector, потому что это традиционный математический вектор, а этот вектор должен называться массивом . Однако терминология развивалась не так».
Просто чтобы сказать, почему это, вероятно, не называется array
: Потому что std::vector
имеет динамический размер. Массив концептуально фиксирован по длине. Кстати, у следующего C ++ Standard есть std::array
шаблон, который имеет фиксированный размер и должен быть предпочтительнее простого массива:
std::array<int, 4> f = { 1, 2, 3, 4 };
std::array
было бы бесполезным.
Чтобы дополнить отличный ответ от @MarkRuzon:
Алекс сказал, что, чтобы дать имя тому, что сейчас называется std :: vector, он заметил имя, которое Scheme и Common Lisp дали аналогичным структурам данных.
Позже он признает, что был неправ, потому что вектор C ++ не имеет ничего общего с векторами в математике.
Он также говорит, что допустил ошибку сообщества из 50 человек в сообществе из 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 ++», некоторые из них поддерживаются напрямую.
std::vector
не поддерживает арифметические операции, и поэтому все эти свойства не определены для a std::vector
. Таким образом, a std::vector
не квалифицируется как вектор. Я бы назвал это dynamic_array
или resizable_array
который говорит вам, что это такое.
Вектор - это просто последовательность значений одного типа. Это в значительной степени соответствует использованию в математике. Я предполагаю, что математическая идея о том, что векторы должны поддерживать некоторые общие операции (такие как сложение и масштабирование с помощью скаляра), не перенесена, важным аспектом является в основном структура.
Кроме того, если вы сохраняете целые числа или числа с плавающей запятой, это делает отличный тип для хранения N размерных векторов. Ведь все, что есть вектор, это список чисел, хранящихся в определенном порядке.
0.1
, тогда как в математике это значение является членом набора действительных чисел. На языке программирования Java ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ) вектор имеет вид «Класс Vector реализует растущий массив объектов. Как и массив, он содержит компоненты, которые можно получить с помощью целочисленного индекса. Однако размер вектора может увеличиваться или уменьшаться по мере необходимости, чтобы приспособить добавление и удаление элементов после того, как вектор был создан. "
Давным-давно в языке B существуют векторные типы. Тогда язык C назвал их «массивами». Тогда C с классами и языком C ++ просто выводят его ...
Это, конечно, не вся история. Как уже упоминалось выше, Степанов принял фактическое решение. Но если «вектор» все еще использовался в C, результат может выглядеть совсем иначе.
PS. Интересно, почему C переименовывает в «массив». Какова была точная причина?
PS2. IMO для языка как C ++, массив лучше означает «тип содержит элементы, к которым разумно обращаться через оператор []» (т.е. не 42 [some_array_object]), например, создание экземпляра std :: map в качестве «ассоциативного массива».
Я предполагаю, что это происходит от вектора строки термина . Кроме того, компьютерные ученые любят придумывать новые имена для вещей ...
но математические векторы не являются динамическими, я никогда не видел, чтобы одно изменение из 2D в 3D или что-то еще, если что-то традиционное делает массивы для лучших векторов.
Не зная об истинной причине, но C ++, называя его вектором вместо массива, уменьшает путаницу между структурами C и C ++, хотя они выполняют те же роли.
Представьте себе вектор 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
. В этом примере я назвал этот вектор «рваным», потому что он демонстрирует, как размер каждого вектора этого вектора можно изменять независимо. Это не только нарушает правила того, как размеры не могут быть изменены после введения определенного вектора в математику, но также демонстрирует, как его нельзя использовать в качестве матрицы.
Интересно, что параметризация по типам делает с именами ..
здесь столбец взорван .. (см. источник для некоторых навыков кодирования HTML на стороне сервера ASP.NET)
или это был скандал?
Опять же, если подумать об этом в контексте MIMD или даже векторной машины SSE, название все равно звучит чертовски хорошо.