Perché un vettore C ++ è chiamato un vettore?


147

La domanda è piuttosto autoesplicativa. Conosco vagamente i vettori in matematica, ma non vedo davvero il collegamento ai vettori C ++.


5
I vettori (Magnitute + direction) in fisica sono la prima cosa che mi viene in mente nel momento in cui sento la parola vettori.
RBT,

Risposte:


109

La definizione matematica di un vettore è un membro dell'insieme Sn, che è una sequenza ordinata di valori in un insieme specifico ( S). Questo è ciò che vectormemorizza un C ++ .


21
I vettori sono generalmente considerati 2-3 dimensioni solo per il loro uso in fisica. Ma più in generale in matematica, significano solo un insieme di numeri che ha un ordine (gli insiemi matematici sono senza ordine, sono come una borsa piena di roba). Un vettore può avere un numero qualsiasi di elementi.
Joseph Garvin,

8
vartec, un vettore euclideo non può essere rappresentato come un vettore di coordinate e viceversa? Sono solo rappresentazioni diverse della stessa cosa (una tupla) nello spazio euclideo rispetto allo spazio vettoriale più generale.
Calvin,

6
@Joseph Garvin: i vettori non hanno nemmeno bisogno di avere componenti che sono numeri. Ad esempio, alcuni insiemi di funzioni possono essere utilizzati per formare spazi vettoriali in cui i componenti sono funzioni.
Jason,

13
Un vettore è letteralmente un "vettore". La stessa parola è usata per (ad esempio) insetti che trasmettono malattie e proviene dalla stessa radice latina di "veicolo". Quindi è qualcosa che ti porta da un posto all'altro. Per inciso, la parola "matrice" deriva anche dal latino, che significa "grembo".
Artelius,

7
Questi sembrano insoddisfacenti poiché: 1. vettori matematici non cambiano in dimensione, 2. vettori matematici hanno operazioni che std::vectornon forniscono, 3. L'argomento che std::vectorè una sequenza ordinata di valori potrebbe applicarsi a std::list, std::deque, std::basic_string, ecc
jamesdlin

190

Si chiama vettore perché Alex Stepanov, il designer della Standard Template Library, stava cercando un nome per distinguerlo dagli array incorporati. Ora ammette di aver fatto un errore, perché la matematica usa già il termine "vettore" per una sequenza di numeri a lunghezza fissa. C ++ 11 aggrava questo errore introducendo un 'array' di classe che si comporta in modo simile a un vettore matematico.

La lezione di Alex: fai molta attenzione ogni volta che dai un nome a qualcosa.


1
Ma l'array non utilizzerà anche l'allocazione dell'heap, il che rende lo spostamento meno efficiente. Abbiamo anche std :: valarray, a proposito.
sellibitze,

1
È possibile allocarlo sull'heap se si desidera una mossa economica.

2
Bello sapere che hanno imparato quella lezione anche se è troppo tardi. Anche se ... typedef o #define possono risolverlo.
LearnCocos2D,

4
Ci sono solo due cose difficili in Informatica: invalidazione della cache e cose di denominazione - Phil Karlton
RBT

8
se hai intenzione di dichiarare "[Alex Stepanov] ammette ora di aver commesso un errore" nella tua risposta, potresti fornire una citazione?
Trevor Boyd Smith,

56

Un estratto dal linguaggio di programmazione C ++ di Bjarne Stroustrup:

"Si potrebbe sostenere che valarray avrebbe dovuto essere chiamato vettore perché è un vettore matematico tradizionale e quel vettore avrebbe dovuto essere chiamato matrice . Tuttavia, non è così che la terminologia si è evoluta."


51
Pfftt .. cosa sa quel tizio. Non ho mai nemmeno sentito parlare di questa persona "Bjarne Stroustrup".
Calvin,

5
Mi chiedo solo quanti dei voti del commento precedente siano in realtà il risultato di un underflow ...
rindeal

16

Il nome deriva dall'algebra lineare, dove il vettore è matrice con una sola colonna o una sola riga.


10

Giusto per dire perché probabilmente non viene chiamato array: perché std::vectorha una dimensione dinamica. Un array è concettualmente di lunghezza fissa. Il prossimo standard C ++ tra l'altro ha un std::arraymodello, che è di dimensioni fisse e dovrebbe essere preferito su un semplice array:

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

Quel nuovo standard C ++ è già stato rilasciato?
Johannes Jensen,

1
questa non è una grande risposta, poiché anche un vettore ha dimensioni fisse. i vettori sono valori puri, sono elementi in un insieme che insieme ad alcune strutture aggiuntive formano uno spazio vettoriale astratto. l'idea di "cambiare la dimensione" di un vettore è una totale assurdità.
Sara

@kai penso che ci sia confusione qui. Ho semplicemente sostenuto motivo per cui è non è chiamata matrice . Non ho provato a spiegare perché si chiama specificamente vettore . Un array in C ++ anche prima della standardizzazione del linguaggio ha sempre avuto una dimensione fissa, quindi nominare la classe ridimensionabile non std::arraysarebbe utile.
Johannes Schaub - litb

ora puoi giustamente lamentarti che non si tratta di una risposta, ma di un commento valido. Pertanto, concordo con la prima mezza frase (fino alla virgola) del tuo commento. Tuttavia, ora è troppo tardi per spostare la mia risposta in un commento sulla domanda, perché questi utili commenti di te e @ user12 andrebbero persi.
Johannes Schaub - litb

Come compromesso per risolvere il dilemma, ho creato la wiki della risposta della community. Questo rimuove tutti i punti di voto positivo e le perdite di voto negativo che ho ricevuto dal mio account. Se qualcuno vuole ancora ringraziarmi per il mio ingegnoso commento sotto mentite spoglie, può votare questo commento rappresentativo.
Johannes Schaub - litb,

10

Per completare l'eccellente risposta di @MarkRuzon:

Alex ha detto che per dare un nome a quello che ora viene chiamato std :: vector ha osservato il nome che Scheme e Common Lisp avevano dato a strutture di dati simili.

Successivamente ammette di aver sbagliato a causa del C ++ vettore non ha nulla a che fare con i vettori in matematica.

Dice anche che ha introdotto un errore di una comunità di 50 persone in una comunità di 5 milioni di persone, quindi è probabile che l'errore rimanga per sempre.


5

È solo il nome. Il vettore C ++ potrebbe benissimo (o forse anche più preciso) essere chiamato array dinamico o array ridimensionabile, ma questo nome è stato semplicemente scelto . Questo vettore non è lo stesso vettore della metrica perché in matematica i vettori sono membri di qualsiasi insieme V in modo tale che ci siano due importanti operazioni definite su questo insieme: + (aggiunta di vettori) e x (moltiplicazione di un vettore per uno scalare dal campo F ) e queste operazioni soddisfano 8 assiomi :


Associatività dell'addizione

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

Commutatività dell'aggiunta

u + v = v + u

Elemento identità di addizione

Esiste un elemento 0 ∈ V , chiamato vettore zero , tale che v + 0 = v per tutto v ∈ V .

Elementi inversi di addizione

Per ogni v ∈ V, esiste un elemento −v ∈ V , chiamato l' inverso additivo di v, tale che v + (−v) = 0

Compatibilità della moltiplicazione scalare con la moltiplicazione del campo

a (bv) = (ab) v

Elemento di identità della moltiplicazione scalare

1 v = v, dove 1 indica l' identità moltiplicativa in F .

Distributività della moltiplicazione scalare rispetto all'aggiunta vettoriale  

a (u + v) = au + av

Distributività della moltiplicazione scalare rispetto all'aggiunta sul campo

(a + b) v = av + bv


Il C ++ li std::vectorsupporta tutti (non direttamente, ma tramite le funzionalità C ++), quindi può in qualche modo essere definito un vettore, ma è solo colloquialismo e ad esempio Vallaraysottolineato da Bjarne Stroustrup in "Linguaggio di programmazione C ++" supporta alcuni di essi direttamente.


3
Nessun contenitore in C ++ ha quel tipo di aritmetica definito, quindi non ci sono vettori in C ++. In particolare a std::vectornon supporta le operazioni aritmetiche e quindi tutte queste proprietà non sono definite per a std::vector. Quindi a std::vectornon si qualifica come vettore. L'avrei chiamato dynamic_arrayo resizable_arrayche ti dice che cos'è.
user877329

4
O semplicemente "elenco". Ma noooooo ... doveva essere "vettoriale" perché è quello che usano tutti , giusto?
LearnCocos2D,

1
@ LearnCocos2D, beh, un elenco è generalmente inteso come un elenco collegato. In effetti, esiste già un contenitore chiamato list nella libreria standard C ++ - è un elenco doppiamente collegato.
Andrej,

3

Un vettore è semplicemente una sequenza di valori, tutti dello stesso tipo. Questo è praticamente in linea con l'uso in matematica. Immagino che l'idea matematica secondo cui i vettori dovrebbero supportare alcune operazioni comuni (come l'aggiunta e il ridimensionamento da uno scalare) non vengano mantenute, l'aspetto importante è principalmente la struttura.


Nell'algebra lineare, da cui il "vettore" deriva dalla matematica, tutto riguarda le operazioni, con tutti i vettori della stessa dimensione. L'algebra lineare, quindi le operazioni , è ciò che rende un gruppo di numeri un vettore in matematica.
E4z9

3

Inoltre, se lo fai memorizzare numeri interi o in virgola mobile, crea un tipo eccellente per la memorizzazione di vettori di dimensioni N. Dopotutto un vettore è, è un elenco di numeri conservati in un ordine specifico.


questo è palesemente falso, non è quello che un vettore è en.wikipedia.org/wiki/Vector_space
sara

@kai Troverai questi conflitti anche in altre aree. I numeri reali in alcuni linguaggi di programmazione non saranno in grado di memorizzare 0.1, dov'è in matematica, questo valore è un membro dell'insieme dei numeri reali. Nel linguaggio di programmazione Java ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ) un vettore è "La classe Vector implementa una matrice di oggetti coltivabile. Come una matrice, contiene componenti che è possibile accedere utilizzando un indice intero. Tuttavia, le dimensioni di un vettore possono aumentare o diminuire in base alle esigenze per consentire l'aggiunta e la rimozione di elementi dopo la creazione del vettore. "
Johannes Schaub - litb

Quanto a ciò che un vettore è , dipende la cui definizione si utilizza. Dato che questa domanda è stata posta su stackoverflow.com , piuttosto che su math.stackexchange.com , qui vorrei discutere per un approccio meno distorto dalla matematica.
Johannes Schaub - litb

@kai Conosco bene la definizione di vettore per quanto riguarda gli spazi vettoriali. Conosco anche le definizioni di informatica, in cui un vettore è semplicemente un elenco di numeri adiacenti in memoria, ovvero una matrice. Si noti che nella pagina di chiarimento delle ambiguità per il vettore in Wikipedia che mostrano un significato per essere un array 1D. Questo è esattamente lo stesso significato che viene utilizzato per i processori vettoriali, che esistono da almeno gli anni '70. Pertanto, mentre la definizione che ho dato non è la definizione matematica rigorosa, è una definizione di informatica, sebbene più antica.
James Matta,

3

Molto tempo fa, nel linguaggio B ci sono tipi di vettori. Quindi il linguaggio C li ha chiamati "array". Quindi la C con Classi e il linguaggio C ++ l'hanno appena derivata ...

Questa non è certamente l'intera storia. Come accennato in precedenza, Stepanov ha preso la decisione effettiva. Ma se "C" fosse ancora usato in C, il risultato potrebbe apparire piuttosto diverso.

PS. Mi chiedo perché C rinomina "array". Qual è stata la ragione esatta?

PS2. IMO per un linguaggio come C ++, un array significa meglio "elementi di tipo hold a cui si accede ragionevolmente tramite l'operatore []" (ovvero non 42 [oggetto_array]), ad esempio un'istanza di std :: map come "array associativo".


2

Immagino che provenga dal termine riga vector . Inoltre, gli informatici amano pensare a nuovi nomi per le cose ...


2

ma i vettori matematici non sono dinamici, non ho mai visto un cambiamento dal 2D al 3D o qualsiasi altra cosa, se qualcosa di tradizionale matrici rendono vettori migliori.


certo che i vettori matematici sono considerati in molte dimensioni. Se per essere dinamico intendi che il vettore cambia la sua dimensione, allora può facilmente corrispondere al matematico "considera questo vettore nella dimensione x" aggiungendo o troncando le coordinate. Una semplice trasformazione lineare può mappare i vettori dallo spazio n-dim ai vettori nello spazio m-dim. I vettori matematici sono MOLTO dinamici.
4pie0

1

Nessuna idea del vero motivo, ma C ++ che lo chiama un vettore anziché un array, riduce la confusione tra le strutture C e C ++, sebbene svolgano gli stessi ruoli.


1

Pensa a un vettore C ++ come a un array dinamico, la cui dimensione può essere modificata inserendo o rimuovendo elementi. Non sono collegati alla definizione matematica del vettore.

Vettori in matematica

Considera una nxmmatrice chiamata A, dove ncorrisponde al numero di righe e mcorrisponde al numero di colonne. In un contesto matematico, una volta introdotta una matrice come questa, in seguito non è possibile eseguire alcuna operazione al di fuori Adell'intervallo e non è possibile estendere Ale dimensioni. Ciò significa che non è possibile fare riferimento a un indice di [n + 1]e / o [m + 1].

Ora, un vettore di Aderiva anche questi attributi, mentre le loro dimensioni saranno sempre 1xm(qualsiasi [i]riga selezionata all'interno A) o nx1(qualsiasi [j]colonna selezionata all'interno A). Inoltre, non è possibile specificare un vettore come 2xn, poiché una raccolta di vettori non può essere interpretata come un vettore, mentre un vettore - lascia che sia il [i]vettore di colonna Acon le dimensioni di1xm - può essere interpretato come una matrice.

L'importante da asporto è che non è possibile modificare le dimensioni di un vettore una volta introdotto in termini matematici.

Vettori in C ++

In C ++, i vettori sono proprio come i vettori in matematica, ma a differenza della matematica la loro dimensione può essere modificata . La dimensione come termine si applica qui perché implica il conteggio degli elementi che contiene un vettore particolare.

È utilizzare le dimensioni termine in termini di vettori di C ++, quando si dispone di un vettore di vettori: std::vector<std::vector<T>>> ragged_array. In questo esempio, ho chiamato quel vettore "sfilacciato", perché dimostra come la dimensione di ciascun vettore di quel vettore può essere modificata in modo indipendente. Non solo viola le regole di come le dimensioni non possono essere modificate una volta che un particolare vettore viene introdotto in matematica, ma dimostra anche come non può essere usato come matrice.


0

Si chiede che la parametrizzazione sui tipi faccia nomi ...

qui viene distrutta una colonna .. (visualizza sorgente per alcune competenze di codifica HTML ASP.NET sul lato server)

o era una fila?

Poi di nuovo, pensandoci nel contesto della macchina vettoriale MIMD o SSE, il nome suona ancora dannatamente bene.


-2

deriva dalla struttura della matrice che si costruisce dai vettori

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.