Чому вектор C ++ називається вектором?


147

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


5
Вектори (Magnitute + напрям) у фізиці - це перше, що вражає мою думку, коли я чую слово вектори.
RBT

Відповіді:


109

Математичне визначення вектора - це член множини Sn, що є впорядкованою послідовністю значень у певному наборі ( S). Це те, що vectorзберігає C ++ .


21
Вектори, як правило, вважаються 2-3-мірними через їх використання у фізиці. Але загальніше в математиці вони просто мають на увазі набір чисел, що має порядок (математичні набори без замовлення, вони схожі на мішок, наповнений речами). Вектор може мати будь-яку кількість елементів.
Джозеф Гарвін

8
Вартеку, чи не можна евклідового вектора представити як координатний вектор і навпаки? Вони просто різні уявлення про одне і те ж (кортеж) в евклідовому просторі проти більш загального векторного простору.
Кальвін

6
@ Джозеф Гарвін: Векторам навіть не потрібно мати компоненти, які є числами. Наприклад, певні набори функцій можуть використовуватися для формування векторних просторів, де компонентами є функції.
Jason

13
Вектор - це буквально "носій". Це ж слово використовується для (наприклад) комах, що передають хворобу, і походить від того ж латинського кореня, що і «засіб». Тож це щось, що переносить вас з одного місця в інше. До речі, слово "матриця" також з латинської, що означає "утроба".
Артелій

6
Це здається незадовільним , так як : 1. Математичні вектори не змінюються в розмірності, 2. Математичні вектори мають операції , які std::vectorне забезпечують, 3. Аргумент , що std::vectorпредставляє собою упорядковану послідовність значень може застосовуватися до std::list, std::deque, std::basic_stringі т.д.
jamesdlin

189

Його називають вектором, тому що Олексій Степанов, дизайнер бібліотеки стандартних шаблонів, шукав ім’я, щоб відрізнити його від вбудованих масивів. Тепер він визнає, що допустив помилку, оскільки математика вже використовує термін "вектор" для послідовності чисел з фіксованою довжиною. C ++ 11 поєднує цю помилку, вводячи клас "масив", який поводиться аналогічно математичному вектору.

Урок Алекса: будьте дуже обережні щоразу, коли щось називаєте.


1
Але масив також не буде використовувати розподіл купи, що робить його менш ефективним. У нас також є std :: valarray, btw.
sellibitze

1
Ви можете виділити його на купі - бажаний дешевий хід.

2
Приємно знати, що вони засвоїли цей урок, хоча вже пізно. Хоча ... typedef або #define теж можуть це виправити.
LearnCocos2D

4
У комп’ютерній науці є лише дві важкі речі: недійсність кешу та іменування речей - Філ Карлтон
RBT

7
якщо ви збираєтесь претендувати на те, що "[Алекс Степанов] зізнається, що він допустив помилку" у вашій відповіді, будь ласка, надайте цитати?
Тревор Бойд Сміт

56

Уривок з мови програмування на C ++ від Bjarne Stroustrup:

"Можна стверджувати, що valarray слід було б називати вектором, тому що це традиційний математичний вектор, і цей вектор повинен був би називатися масивом . Однак термін не розвивався".


51
Pfftt .. що знає той хлопець Я ніколи навіть не чув про цю людину "Bjarne Stroustrup".
Келвін

5
Мені просто цікаво, скільки результатів попереднього коментаря насправді є результатом підтоплення ...
rindeal

16

Назва походить від лінійної алгебри, де вектор є матрицею з лише одним стовпцем або лише одним рядком.


10

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

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

Чи вийшов новий стандарт C ++?
Йоханнес Йенсен

1
це не багато відповіді, оскільки вектор має і фіксований розмір. вектори - це чисті значення, вони є елементами в наборі, які разом з деякою додатковою структурою утворюють абстрактний векторний простір. поняття "зміна розміру" вектора - це повна нісенітниця.
сара

@kai Я думаю, тут є плутанина. Я просто сперечався, чому його не називають масивом . Я не намагався пояснити, чому це конкретно називається вектором . Масив на C ++ ще до стандартизації мови завжди мав фіксований розмір, тому іменування змінного класу не std::arrayбуло б корисним.
Йоханнес Шауб - ліб

Тепер ви можете правильно поскаржитися, що це не стільки відповідь, скільки вагомий коментар. Наскільки я погоджуюся з першим півреченням (до коми) вашого коментаря. Однак зараз уже пізно переносити мою відповідь в коментар до питання, оскільки ці корисні коментарі вас і @ user12 будуть втрачені.
Йоханнес Шауб - ліб

Як компроміс для вирішення дилеми я зробив вікі спільноти відповідей. Це видаляє всі точки оновлення та втрати, пов'язані з знищенням рахунку, отримані від мого облікового запису. Якщо хтось все ще хоче подякувати мені за мою геніальну маскування під маскуванням, він може підтримати цей коментар.
Йоханнес Шауб - ліб

10

Щоб доповнити відмінну відповідь від @MarkRuzon:

Алекс сказав, що, щоб дати ім'я тому, що зараз називається std :: vector, він спостерігав ім'я, яке надали Scheme та Common Lisp подібним структурам даних.

Пізніше він визнає, що помилявся, оскільки вектор C ++ не має нічого спільного з векторами математики.

Він також каже, що він ввів помилку спільноти 50 осіб до громади 5 мільйонів людей, тому помилка, ймовірно, залишиться назавжди.


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 ++", він підтримує деякі з них безпосередньо.


3
У жодному контейнері на C ++ немає такої арифметичної форми, тому векторів в C ++ немає. Зокрема, a std::vectorне підтримує арифметичні операції, і тому всі ці властивості не визначені для a std::vector. Тож а std::vectorне кваліфікується як вектор. Я б назвав це, dynamic_arrayабо resizable_arrayце говорить вам, що це таке.
user877329

4
Або просто "список". Але noooooo ... це повинно було бути "вектором", бо саме цим користуються всі , правда?
LearnCocos2D

1
@ LearnCocos2D, ну, звичайно, цей список розуміється як пов'язаний список. Насправді, у стандартній бібліотеці C ++ вже є контейнер з назвою - це подвійний список.
Андрій

3

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


У лінійній алгебрі, звідки "вектор" походить з математики, все стосується операцій, при цьому всі вектори мають однаковий розмір. Лінійна алгебра, тобто операції , - це те, що робить купу чисел вектором математики.
E4z9

3

Крім того, якщо ви змусите його зберігати цілі чи плаваючі точки, це робить відмінний тип для зберігання N розмірних векторів. Зрештою, вектор є списком чисел, що зберігаються у певному порядку.


це явно неправдиво, тобто не те, що вектором є en.wikipedia.org/wiki/Vector_space
sara

@kai Ці конфлікти ви знайдете і в інших областях. Реальні числа в деяких мовах програмування не зможуть зберігати 0.1, якщо в математиці це значення є членом набору реальних чисел. У мові програмування Java ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ) вектором є "Клас Vector реалізує масив об'єктів, що розростається. Як і масив, він містить компоненти, які доступ до них можна використовувати за допомогою цілого індексу. Однак розмір вектора може зростати або зменшуватися, якщо потрібно, щоб вмістити додавання та видалення елементів після того, як вектор був створений. "
Йоханнес Шауб - ліб

Що ж стосується того, що вектор є , це залежить від того , визначення ви використовуєте. Оскільки це питання було задано на stackoverflow.com , а не на math.stackexchange.com , я б посперечався з меншою математики упередженого підходу тут.
Йоханнес Шауб - ліб

@kai Я досить добре знайомий з визначенням вектора щодо векторних просторів. Мені також знайомі визначення з інформатики, де вектор - це лише список номерів, суміжних у пам'яті, тобто масив. Зауважте, що на сторінці розбірливості для вектору у вікіпедії вони показують одне значення як 1D масив. Це саме те саме значення, яке використовується для векторних процесорів, які існують з принаймні 70-х років. Тому, хоча визначення, яке я дав, не є суворим математичним визначенням, це визначення інформатики, хоч і старіше.
Джеймс Матта

3

Давно в мові B існують векторні типи. Тоді мова С назвала їх "масивами". Тоді C із класами та мовою C ++ просто вивели його ...

Це, звичайно, не вся історія. Як було сказано вище, Степанов прийняв фактичне рішення. Але якщо "вектор" все ж використовувався в C, результат може виглядати зовсім інакше.

PS. Цікаво, чому C перейменовує "масив". Яка була точна причина?

PS2. IMO для мови, як C ++, масив краще означає "елементи утримування типу, до яких розумно можна отримати доступ через оператор []" (тобто не 42 [some_array_object]), наприклад, інстанціювання std :: map як "асоціативного масиву".


2

Я б здогадувався, що це походить від векторного ряду терміна . Також комп'ютерні фахівці люблять придумувати нові назви речей ...


2

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


впевнені, що математичні вектори розглядаються в багатьох вимірах. Якщо динамічно ви маєте на увазі, що вектор змінює свій розмір, то він може легко відповідати математичному "розглянути цей вектор у розмірності x" шляхом додавання або обрізання координат. Просте лінійне перетворення може відображати вектори від n-затемненого простору до векторів у m-dim просторі. Математичні вектори ДУЖЕ динамічні.
4pie0

1

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


1

Подумайте про вектор C ++ як про динамічний масив, розмір якого можна змінити, вставляючи або видаляючи елементи. Вони не пов'язані з математичним визначенням вектора.

Вектори з математики

Розглянемо nxmматрицю під назвою A, де nвідповідає кількості рядків і mвідповідає кількості стовпців. У математичному контексті, коли ви вводите таку матрицю, то пізніше, ви не можете робити жодних операцій поза межами Aдіапазону ', а також не можете збільшити Aрозмір. Це означає, що ви не можете посилатися на індекс [n + 1]та / або [m + 1].

Тепер вектор Aотримує ці атрибути, тоді як їх розміри завжди будуть 1xm(будь-який [i]рядок, обраний усередині A) або nx1(будь-який [j]стовпець, обраний всередині A). Вектор також не може бути визначений як 2xn, тому що колекція векторів не може бути інтерпретована як один вектор, тоді як один вектор - нехай це [i]вектор стовпців Aз розмірами1xm - може бути інтерпретований як матриця.

Важливим способом є те, що ви не можете змінити розміри вектора, як тільки він буде введений з точки зору математики.

Вектори в С ++

У C ++ вектори подібно до векторів математики, але на відміну від математики їх розміри можуть бути змінені . Розмір як термін застосовується тут, оскільки він передбачає кількість елементів, що містить один конкретний вектор.

Ви можете використовувати термін розміри в термінах векторів C ++, якщо у вас є вектор векторів: std::vector<std::vector<T>>> ragged_array. У цьому прикладі я назвав цей вектор "рваним", оскільки він демонструє, як розмір кожного вектора цього вектора може змінюватися незалежно. Він не тільки порушує правила того, як розміри неможливо змінити, коли конкретний вектор вводиться в математику, але й демонструє, як його не можна використовувати як матрицю.


0

Цікаво, що параметризація типів робить імена ..

тут стовпець розкривається .. (перегляньте джерело для деяких навичок кодування HTML на ASP.NET на стороні сервера)

чи це був ряд?

Потім знову, думаючи про це в контексті векторної машини MIMD або навіть SSE, назва все ще звучить чортво добре.


-2

це походить від структури матриці, яка будується з векторів

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.