Ответ 1
Математическое определение вектора является членом множества S
n
которое является упорядоченной последовательностью значений в определенном наборе (S
). Это то, что хранит С++ vector
.
На самом деле вопрос довольно понятен. Я смутно знаю о векторах в математике, но на самом деле я не вижу ссылку на векторы С++.
Математическое определение вектора является членом множества S
n
которое является упорядоченной последовательностью значений в определенном наборе (S
). Это то, что хранит С++ vector
.
Он назвал вектор, потому что Алекс Степанов, разработчик стандартной библиотеки шаблонов, искал имя, чтобы отличить его от встроенных массивов. Он признает теперь, что ошибся, потому что математика уже использует термин "вектор" для последовательности чисел с фиксированной длиной. Теперь С++ 0X усугубит эту ошибку, введя класс 'array', который будет вести себя аналогично математическому вектору.
Урок Алекс: будьте очень осторожны каждый раз, когда вы что-то называете.
Отрывок из языка программирования С++ от Bjarne Stroustrup:
"Можно было бы утверждать, что валяра следовало бы назвать векторным потому что это традиционный математический вектор и этот вектор следует назвать массивом. Однако это не так, как терминология развилась".
Название происходит от линейной алгебры, где vector - матрица с одним столбцом или только с одной строкой.
Просто сказать, почему он, вероятно, не называется array
: Поскольку std::vector
имеет динамический размер. Массив концептуально фиксирован по длине. Следующий стандарт С++, кстати, имеет шаблон std::array
, который фиксирован по размеру и должен быть предпочтительнее простого массива:
std::array<int, 4> f = { 1, 2, 3, 4 };
Также, если вы делаете его целыми или плавающими точками, он делает отличный тип для хранения N-мерных векторов. Ведь весь вектор есть, это список чисел, хранящихся в определенном порядке.
Это просто имя. С++ вектор может быть очень хорошо (или, может быть, даже более точным) называться динамическим массивом или изменяемым размером, но это имя было просто выбрано. Этот вектор не совпадает с вектором из математики, потому что в векторах математики есть члены любого набора 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 обозначает мультипликативное тождество в F.
Распределительность скалярного умножения относительно векторного сложения
a (u + v) = au + av
Распределительность скалярного умножения относительно сложения поля
(a + b) v = av + bv
С++ std::vector
поддерживает все из них (не напрямую, а через функции С++), поэтому его можно каким-то образом называть вектором, но это просто коллоквиализм и, например, Vallaray
, обозначенный Bjarne Stroustrup в "Программе на С++" Язык "поддерживает некоторые из них напрямую.
Вектор - это просто последовательность значений, все одного типа. Это в значительной степени соответствует использованию в математике. Я предполагаю, что математическая идея о том, что векторы должны поддерживать некоторые общие операции (такие как добавление и масштабирование скаляром), не переносятся, важным аспектом является в основном структура.
В дополнение к отличному отклику от @MarkRuzon:
Алекс сказал, что, чтобы дать имя тому, что теперь называется std::vector, он заметил имя, которое Scheme и Общие Lisp предоставили аналогичные структуры данных.
Позже он признает, что был не прав, потому что С++ вектор не имеет ничего общего с векторами в математике.
Он также говорит, что он ввел ошибку сообщества из 50 человек в сообщество из 5 миллионов человек, поэтому ошибка, вероятно, останется навсегда.
Давным-давно в языке B существуют типы векторов. Тогда язык C назвал их "массивами". Тогда C с классами и языком С++ просто вывел его...
Это, конечно, не вся история. Как упоминалось выше, Степанов принял фактическое решение. Но если "вектор" все еще использовался в C, результат может выглядеть совсем по-другому.
PS. Интересно, почему C переименовывает "массив". Какова была точная причина?
PS2. ИМО для языка как С++, массив лучше означает "элементы удержания типа, которые можно получить с помощью оператора []" (т.е. Не 42 [some_array_object]), например. экземпляр std:: map как "ассоциативный массив".
Я предполагаю, что это исходит из термина вектор строки. Кроме того, компьютерные ученые любят придумывать новые имена для вещей...
Не знаю реальной причины, но С++ называет ее вектором вместо массива, уменьшает путаницу между структурами C и С++, хотя они выполняют одни и те же роли.
Чудеса, связанные с параметризацией по типам.
здесь колонка получает blasted.. (просмотреть исходный код для некоторых серверных ASP.NET навыков кодирования HTML)
или это была строка?
И снова, думая об этом в MIMD или даже в контексте векторной машины SSE, имя по-прежнему звучит чертовски хорошо.
но математические векторы не являются динамическими, я никогда не видел одно изменение от 2D до 3D или чего-либо еще, если что-то из традиционных массивов делает для лучших векторов.
он исходит из структуры матрицы, которая строится из векторов