Dlaczego wektor C ++ nazywany jest wektorem?


147

To pytanie jest naprawdę oczywiste. Wiem niejasno o wektorach w matematyce, ale tak naprawdę nie widzę linku do wektorów C ++.


5
Wektory (magnitut + kierunek) w fizyce to pierwsza rzecz, która przychodzi mi do głowy, gdy słyszę słowo wektory.
RBT

Odpowiedzi:


109

Matematyczna definicja wektora jest członkiem zbioru Sn, który jest uporządkowaną sekwencją wartości w określonym zbiorze ( S). To właśnie vectorprzechowuje C ++ .


21
Wektory zazwyczaj uważa się za 2-3-wymiarowe ze względu na ich zastosowanie w fizyce. Ale bardziej ogólnie w matematyce oznaczają one po prostu zbiór liczb, które mają uporządkowany porządek (zbiory matematyczne są nieporządane, są jak worek wypełniony rzeczami). Wektor może mieć dowolną liczbę elementów.
Joseph Garvin,

8
vartec, czy wektor euklidesowy nie może być reprezentowany jako wektor współrzędnych i na odwrót? Są po prostu różnymi reprezentacjami tej samej rzeczy (krotki) w przestrzeni euklidesowej w porównaniu z bardziej ogólną przestrzenią wektorową.
Calvin

6
@Joseph Garvin: Wektory nie muszą nawet mieć elementów, które są liczbami. Na przykład pewne zestawy funkcji mogą być używane do tworzenia przestrzeni wektorowych, w których składowe są funkcjami.
jason

13
Wektor jest dosłownie „nośnikiem”. To samo słowo jest używane dla (np.) Owadów przenoszących choroby i pochodzi od tego samego łacińskiego rdzenia co „nośnik”. Jest to więc coś, co przenosi cię z jednego miejsca w drugie. Nawiasem mówiąc, słowo „matryca” również pochodzi z łaciny i oznacza „łono”.
Artelius

6
Te wydaje się niezadowalająca, ponieważ: 1. Wektory matematyczne nie zmieniają w wymiarze 2. Wektory matematyczne operacje, które std::vectornie przewiduje 3. Argument, że std::vectorjest uporządkowanym ciągiem wartości można zastosować do std::list, std::deque, std::basic_string, itd.
jamesdlin

189

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.


1
Ale tablica również nie będzie używać alokacji sterty, co sprawia, że ​​przenoszenie jej jest mniej wydajne. Mamy też std :: valarray, btw.
sellibitze

1
Możesz go ulokować na stercie, jeśli pożądany jest tani ruch.

2
Miło wiedzieć, że nauczyli się tej lekcji, chociaż jest już za późno. Chociaż ... typedef lub #define też mogą to naprawić.
LearnCocos2D

4
W informatyce są tylko dwie trudne rzeczy: unieważnianie pamięci podręcznej i nazywanie rzeczy - Phil Karlton
RBT

7
jeśli zamierzasz twierdzić, że „[Alex Stepanov] przyznaje teraz, że popełnił błąd” w swojej odpowiedzi, czy możesz podać cytat?
Trevor Boyd Smith

56

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”.


51
Pfftt… co wie ten facet. Nigdy nawet nie słyszałem o osobie „Bjarne Stroustrup”.
Calvin

5
Zastanawiam się tylko, ile głosów poparcia poprzedniego komentarza jest w rzeczywistości wynikiem niedomiaru ...
rindeal

16

Nazwa pochodzi od algebry liniowej, gdzie wektor to macierz z tylko jedną kolumną lub tylko jednym wierszem.


10

Powiem tylko, dlaczego prawdopodobnie nie jest nazywany array: ponieważ std::vectorma rozmiar dynamiczny. Koncepcyjnie tablica ma stałą długość. Nawiasem mówiąc, Next C ++ Standard ma std::arrayszablon, który ma stały rozmiar i powinien być preferowany niż zwykła tablica:

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

Czy ten nowy standard C ++ został już wydany?
Johannes Jensen

1
to nie jest dobra odpowiedź, ponieważ wektor ma również stały rozmiar. wektory są czystymi wartościami, są elementami w zbiorze, które razem z jakąś dodatkową strukturą tworzą abstrakcyjną przestrzeń wektorową. pojęcie „zmiany rozmiaru” wektora jest kompletnym nonsensem.
sara,

@kai myślę, że jest tu zamieszanie. Po prostu argumentowałem, dlaczego nie nazywa się to tablicą . Nie próbowałem wyjaśnić, dlaczego jest konkretnie nazywany wektorem . Tablica w C ++, nawet przed standaryzacją języka, zawsze miała stały rozmiar, więc nazwanie klasy o zmiennym rozmiarze std::arraynie byłoby dobre.
Johannes Schaub - litb

teraz możesz słusznie narzekać, że to nie jest odpowiedź, ale ważny komentarz. O ile zgadzam się z pierwszą połową zdania (do przecinka) Twojego komentarza. Jednak teraz jest już za późno, aby przenieść moją odpowiedź do komentarza do pytania, ponieważ te przydatne komentarze Ciebie i @ user12 zostałyby utracone.
Johannes Schaub - litb

Jako kompromis w celu rozwiązania tego dylematu, stworzyłem odpowiedź wiki społeczności. To usuwa wszystkie punkty upvote i przegrane z mojego konta. Jeśli ktoś nadal chce mi podziękować za mój genialny komentarz w przebraniu, może zagłosować za tym reprezentacyjnym komentarzem.
Johannes Schaub - litb

10

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.


5

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::vectorobsł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 Vallaraywskazany przez Bjarne Stroustrup w "C ++ Programming Language" obsługuje niektóre z nich bezpośrednio.


3
Żaden kontener w C ++ nie ma zdefiniowanej arytmetyki tego rodzaju, więc w C ++ nie ma wektorów. W szczególności a std::vectornie obsługuje operacji arytmetycznych, dlatego wszystkie te właściwości są niezdefiniowane dla a std::vector. Zatem a std::vectornie kwalifikuje się jako wektor. Nazwałbym to dynamic_arraylub resizable_arrayco mówi ci, co to jest.
user877329

4
Lub po prostu „lista”. Ale nieeeee ... to musiał być „wektor”, ponieważ wszyscy tego używają, prawda?
LearnCocos2D

1
@ LearnCocos2D, cóż, lista jest zwykle rozumiana jako lista połączona. W rzeczywistości istnieje już kontener o nazwie lista w standardowej bibliotece C ++ - jest to lista podwójnie połączona.
Andrej

3

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.


W algebrze liniowej, skąd w matematyce wywodzi się „wektor”, wszystko dotyczy operacji, a wszystkie wektory mają ten sam rozmiar. Algebra liniowa, a więc operacje , są tym, co sprawia, że ​​zbiór liczb jest wektorem w matematyce.
E4z9

3

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.


to jest rażąco fałszywe, to nie jest to, czym wektor jest en.wikipedia.org/wiki/Vector_space
sara

@kai Te konflikty znajdziesz również w innych obszarach. Liczby rzeczywiste w niektórych językach programowania nie będą w stanie zapamiętać 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. "
Johannes Schaub - litb

Jak dla co wektorem jest , to zależy od tego, którego definicja używasz. Ponieważ to pytanie zostało zadane na stackoverflow.com , a nie na math.stackexchange.com , opowiadałbym się za podejściem mniej nastawionym na matematykę.
Johannes Schaub - litb

@kai Dość dobrze znam definicję wektora w odniesieniu do przestrzeni wektorowych. Znam również definicje informatyczne, w których wektor jest po prostu listą liczb sąsiadujących w pamięci, czyli tablicą. Zauważ, że na stronie ujednoznacznienia wektorów w Wikipedii, pokazują one jedno znaczenie jako tablica 1D. To jest dokładnie to samo znaczenie, które jest używane w przypadku procesorów wektorowych, które istnieją co najmniej od lat 70. Dlatego, choć podałem definicję, która nie jest ścisłą definicją matematyczną, jest to definicja informatyki, choć starsza.
James Matta,

3

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".


2

Myślę, że pochodzi od terminu wektor wierszowy . Ponadto informatycy uwielbiają wymyślać nowe nazwy dla rzeczy ...


2

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.


z pewnością wektory matematyczne są rozpatrywane w wielu wymiarach. Jeśli będąc dynamicznym, masz na myśli, że wektor zmienia swój rozmiar, to może z łatwością odpowiadać matematycznemu „rozważ ten wektor w wymiarze x” poprzez dodanie lub obcięcie współrzędnych. Prosta transformacja liniowa może mapować wektory z przestrzeni n-dim do wektorów w przestrzeni m-dim. Wektory matematyczne są BARDZO dynamiczne.
4pie0

1

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.


1

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 nxmmacierz o nazwie A, gdzie nodpowiada liczbie wierszy i modpowiada liczbie kolumn. W kontekście matematycznym, kiedy już wprowadzisz taką macierz, a potem później, nie możesz wykonywać żadnych operacji poza Azakresem ani rozszerzać Arozmiaru. Oznacza to, że nie możesz odwoływać się do indeksu [n + 1]i / lub [m + 1].

Teraz wektor Awyprowadza 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 Ao 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.


0

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.


-2

pochodzi ze struktury macierzy zbudowanej z wektorów

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.