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

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

Ответов (16)

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

и + v = v + u

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

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

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

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

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

а (bv) = (ab) v

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

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

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

а (и + v) = au + av

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

(а + б) v = av + bv


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

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

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

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

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

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

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

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

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

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

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

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

Думайте о векторе 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 . В этом примере я назвал этот вектор «рваным», потому что он демонстрирует, как размер каждого вектора этого вектора может быть изменен независимо. Это не только нарушает правила, согласно которым размеры не могут быть изменены после того, как конкретный вектор вводится в математику, но также демонстрирует, как его нельзя использовать в качестве матрицы.