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



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

687   16  

16 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

давным-давно, в язык B есть векторные типы. Затем язык C назвал их "массивами". Затем C с классами и языком C++ просто вывели его ...

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

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

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

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


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

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

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

u + v = v + u

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

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

обратные элементы, кроме

для каждого v ∈ V существует элемент-vV, назвал аддитивный инверсный из 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++" поддерживает некоторые из них напрямую.

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

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

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

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

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

или это был ряд?

опять же, думая об этом в контексте mimd или даже SSE vector machine, имя все еще звучит чертовски хорошо.

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

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

рассмотрим nxm матрица под названием A, где n соответствует количеству строк, и m соответствует количеству столбцов. В математическом контексте, как только вы вводите такую матрицу, то позже вы не можете ничего сделать операции за пределами A's диапазон, и вы не можете расширить A's размер или. Это означает, что вы не можете ссылаться на индекс [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. В этом примере я назвал этот вектор "рваным", потому что он демонстрирует, как размер каждого вектора этого вектора может быть изменен независимо. Это не только нарушает правила того, как размеры не могут быть изменены после введения определенного вектора в математика, но она также демонстрирует, как ее нельзя использовать в качестве матрицы.

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

Comments

    Ничего не найдено.