To pytanie jest naprawdę oczywiste. Wiem niejasno o wektorach w matematyce, ale tak naprawdę nie widzę linku do wektorów C ++.
To pytanie jest naprawdę oczywiste. Wiem niejasno o wektorach w matematyce, ale tak naprawdę nie widzę linku do wektorów C ++.
Odpowiedzi:
Matematyczna definicja wektora jest członkiem zbioru S
n
, który jest uporządkowaną sekwencją wartości w określonym zbiorze ( S
). To właśnie vector
przechowuje C ++ .
std::vector
nie przewiduje 3. Argument, że std::vector
jest uporządkowanym ciągiem wartości można zastosować do std::list
, std::deque
, std::basic_string
, itd.
Nazywa się wektorem, ponieważ Alex Stepanov, projektant Biblioteki szablonów standardowych, szukał nazwy, która pozwoliłaby go odróżnić od wbudowanych tablic. Przyznaje teraz, że popełnił błąd, ponieważ matematyka używa już terminu „wektor” dla sekwencji liczb o stałej długości. C ++ 11 potęguje ten błąd, wprowadzając klasę „tablicę”, która zachowuje się podobnie do wektora matematycznego.
Lekcja Alexa: bądź bardzo ostrożny za każdym razem, gdy coś nazywasz.
Fragment książki The C ++ Programming Language autorstwa Bjarne Stroustrup:
„Można by argumentować, że valarray powinno się nazywać wektorem, ponieważ jest to tradycyjny wektor matematyczny, a wektor powinien być nazywany tablicą . Jednak nie jest to droga ewolucji terminologii”.
Powiem tylko, dlaczego prawdopodobnie nie jest nazywany array
: ponieważ std::vector
ma rozmiar dynamiczny. Koncepcyjnie tablica ma stałą długość. Nawiasem mówiąc, Next C ++ Standard ma std::array
szablon, który ma stały rozmiar i powinien być preferowany niż zwykła tablica:
std::array<int, 4> f = { 1, 2, 3, 4 };
std::array
nie byłoby dobre.
Aby uzupełnić doskonałą odpowiedź od @MarkRuzon:
Alex powiedział, że aby nadać nazwę temu, co obecnie nazywa się std :: vector, zauważył nazwę, którą Scheme i Common Lisp nadały podobnym strukturom danych.
Później przyznaje, że się mylił, ponieważ wektor C ++ nie ma nic wspólnego z wektorami w matematyce.
Mówi również, że wprowadził błąd społeczności złożonej z 50 osób do społeczności liczącej 5 milionów ludzi, więc ten błąd prawdopodobnie pozostanie na zawsze.
To tylko nazwa. Wektor C ++ można bardzo dobrze (a może nawet dokładniej) nazwać tablicą dynamiczną lub tablicą o zmiennym rozmiarze, ale ta nazwa została po prostu wybrana . Ten wektor nie jest tym samym, co wektor z matematyki, ponieważ w matematyce wektory są elementami dowolnego zbioru V, tak że istnieją dwie ważne operacje zdefiniowane na tym zbiorze: + (dodawanie wektorów) i x (mnożenie wektora przez skalar z pola F ) i te operacje spełniają 8 aksjomatów :
Łączność dodawania
u + (v + w) = (u + v) + w
Przemienność dodawania
u + v = v + u
Dodatkowy element tożsamości
Istnieje element 0 ∈ V , zwany wektor zera , tak że v + v = 0 dla wszystkich v ∈ V .
Odwrotne elementy dodawania
Dla każdego v ∈ V istnieje element −v ∈ V , nazywany addytywną odwrotnością v, taki że v + (−v) = 0
Zgodność mnożenia przez skalar z mnożeniem przez pola
a (bv) = (ab) v
Tożsamość elementu mnożenia przez skalar
1 v = v, gdzie 1 oznacza mnożnikowy tożsamości w F .
Dystrybucja mnożenia przez skalar względem dodawania wektorów
a (u + v) = au + av
Dystrybucja mnożenia przez skalar względem dodawania pól
(a + b) v = av + bv
C ++ std::vector
obsługuje wszystkie z nich (nie bezpośrednio, ale poprzez funkcje C ++), więc można go jakoś nazwać wektorem, ale jest to po prostu potoczny i na przykład Vallaray
wskazany przez Bjarne Stroustrup w "C ++ Programming Language" obsługuje niektóre z nich bezpośrednio.
std::vector
nie obsługuje operacji arytmetycznych, dlatego wszystkie te właściwości są niezdefiniowane dla a std::vector
. Zatem a std::vector
nie kwalifikuje się jako wektor. Nazwałbym to dynamic_array
lub resizable_array
co mówi ci, co to jest.
Wektor to po prostu sekwencja wartości tego samego typu. Jest to prawie zgodne z zastosowaniem w matematyce. Myślę, że matematyczny pomysł, że wektory powinny obsługiwać niektóre typowe operacje (takie jak dodawanie i skalowanie przez skalar) nie jest przenoszony, ważnym aspektem jest głównie struktura.
Również jeśli sprawisz, że będzie przechowywać liczby całkowite lub zmiennoprzecinkowe, będzie to doskonały typ do przechowywania wektorów N-wymiarowych. Przecież wektor to lista liczb utrzymanych w określonej kolejności.
0.1
, natomiast w matematyce ta wartość jest członkiem zbioru liczb rzeczywistych. W języku programowania Java ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ) wektor to „Klasa Vector implementuje rosnącą tablicę obiektów. Podobnie jak tablica, zawiera ona komponenty, które można uzyskać dostęp za pomocą indeksu w postaci liczby całkowitej. Jednak rozmiar obiektu Vector może rosnąć lub zmniejszać się w zależności od potrzeb, aby umożliwić dodawanie i usuwanie elementów po utworzeniu wektora. "
Dawno temu w języku B. istnieją typy wektorowe. Następnie język C nazwał je „tablicami”. Następnie C z klasami i język C ++ właśnie go wyprowadził ...
To z pewnością nie jest cała historia. Jak wspomniano powyżej, Stiepanow podjął właściwą decyzję. Ale jeśli „wektor” był nadal używany w C, wynik może wyglądać zupełnie inaczej.
PS. Zastanawiam się, dlaczego C zmienia nazwę „array”. Jaki był dokładny powód?
PS2. IMO dla języka takiego jak C ++, tablica lepiej oznacza "elementy przechowujące typ, do których można uzyskać dostęp za pośrednictwem operatora []" (tj. Nie 42 [some_array_object]), np. Instancja std :: map jako "tablica asocjacyjna".
Myślę, że pochodzi od terminu wektor wierszowy . Ponadto informatycy uwielbiają wymyślać nowe nazwy dla rzeczy ...
ale wektory matematyczne nie są dynamiczne, nigdy nie widziałem żadnej zmiany z 2D na 3D lub cokolwiek innego, jeśli cokolwiek tradycyjne tablice przyczyniają się do lepszych wektorów.
Nie mam pojęcia o prawdziwym przyczynie, ale C ++ nazywanie go wektorem zamiast tablicą zmniejsza zamieszanie między strukturami C i C ++, chociaż pełnią te same role.
Wyobraź sobie wektor C ++ jako tablicę dynamiczną, której rozmiar można zmienić, wstawiając lub usuwając elementy. Nie są one związane z matematyczną definicją wektora.
Wektory w matematyce
Rozważmy nxm
macierz o nazwie A
, gdzie n
odpowiada liczbie wierszy i m
odpowiada liczbie kolumn. W kontekście matematycznym, kiedy już wprowadzisz taką macierz, a potem później, nie możesz wykonywać żadnych operacji poza A
zakresem ani rozszerzać A
rozmiaru. Oznacza to, że nie możesz odwoływać się do indeksu [n + 1]
i / lub [m + 1]
.
Teraz wektor A
wyprowadza również te atrybuty, podczas gdy ich wymiary będą zawsze 1xm
(dowolny [i]
wybrany wiersz A
) lub nx1
(dowolna [j]
wybrana kolumna A
). Wektor nie może być również określony jako 2xn
, ponieważ zbiór wektorów nie może być interpretowany jako jeden wektor, a jeden wektor - niech to będzie [i]
wektor kolumnowy A
o wymiarach1xm
- może być zinterpretowany jako macierz.
Ważnym wnioskiem jest to, że nie można zmienić wymiarów wektora po wprowadzeniu go w zakresie matematyki.
Wektory w C ++
W C ++ wektory są takie same jak wektory w matematyce, ale w przeciwieństwie do matematyki ich rozmiar można zmieniać . Termin `` rozmiar '' ma tutaj zastosowanie, ponieważ implikuje liczbę elementów, które zawiera jeden konkretny wektor.
Użyć wymiary utrzymujące pod względem wektorów C ++, gdy masz wektor wektory: std::vector<std::vector<T>>> ragged_array
. W tym przykładzie nazwałem ten wektor „postrzępionym”, ponieważ demonstruje on, jak niezależnie można zmieniać rozmiar każdego wektora tego wektora. Nie tylko narusza zasady, jak nie można zmienić wymiarów po wprowadzeniu określonego wektora do matematyki, ale także pokazuje, jak nie można go użyć jako macierzy.
Zastanawia się, że parametryzacja typów wpływa na nazwy.
tutaj kolumna zostaje wysadzona ... (wyświetl źródło dla niektórych umiejętności kodowania HTML ASP.NET po stronie serwera)
czy to był rząd?
Z drugiej strony, myśląc o tym w kontekście MIMD lub nawet maszyny wektorowej SSE, nazwa nadal brzmi cholernie dobrze.