Питання насправді досить зрозуміле. Я знаю смутно про вектори математики, але я не бачу посилання на вектори C ++.
Питання насправді досить зрозуміле. Я знаю смутно про вектори математики, але я не бачу посилання на вектори C ++.
Відповіді:
Математичне визначення вектора - це член множини S
n
, що є впорядкованою послідовністю значень у певному наборі ( S
). Це те, що vector
зберігає C ++ .
std::vector
не забезпечують, 3. Аргумент , що std::vector
представляє собою упорядковану послідовність значень може застосовуватися до std::list
, std::deque
, std::basic_string
і т.д.
Його називають вектором, тому що Олексій Степанов, дизайнер бібліотеки стандартних шаблонів, шукав ім’я, щоб відрізнити його від вбудованих масивів. Тепер він визнає, що допустив помилку, оскільки математика вже використовує термін "вектор" для послідовності чисел з фіксованою довжиною. C ++ 11 поєднує цю помилку, вводячи клас "масив", який поводиться аналогічно математичному вектору.
Урок Алекса: будьте дуже обережні щоразу, коли щось називаєте.
Уривок з мови програмування на C ++ від Bjarne Stroustrup:
"Можна стверджувати, що valarray слід було б називати вектором, тому що це традиційний математичний вектор, і цей вектор повинен був би називатися масивом . Однак термін не розвивався".
Просто сказати, чому він, ймовірно, не називається 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
. Тож а 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, результат може виглядати зовсім інакше.
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 ++, якщо у вас є вектор векторів: std::vector<std::vector<T>>> ragged_array
. У цьому прикладі я назвав цей вектор "рваним", оскільки він демонструє, як розмір кожного вектора цього вектора може змінюватися незалежно. Він не тільки порушує правила того, як розміри неможливо змінити, коли конкретний вектор вводиться в математику, але й демонструє, як його не можна використовувати як матрицю.
Цікаво, що параметризація типів робить імена ..
тут стовпець розкривається .. (перегляньте джерело для деяких навичок кодування HTML на ASP.NET на стороні сервера)
чи це був ряд?
Потім знову, думаючи про це в контексті векторної машини MIMD або навіть SSE, назва все ще звучить чортво добре.