La domanda è piuttosto autoesplicativa. Conosco vagamente i vettori in matematica, ma non vedo davvero il collegamento ai vettori C ++.
La domanda è piuttosto autoesplicativa. Conosco vagamente i vettori in matematica, ma non vedo davvero il collegamento ai vettori C ++.
Risposte:
La definizione matematica di un vettore è un membro dell'insieme S
n
, che è una sequenza ordinata di valori in un insieme specifico ( S
). Questo è ciò che vector
memorizza un C ++ .
std::vector
non forniscono, 3. L'argomento che std::vector
è una sequenza ordinata di valori potrebbe applicarsi a std::list
, std::deque
, std::basic_string
, ecc
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.
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."
Giusto per dire perché probabilmente non viene chiamato array
: perché std::vector
ha una dimensione dinamica. Un array è concettualmente di lunghezza fissa. Il prossimo standard C ++ tra l'altro ha un std::array
modello, che è di dimensioni fisse e dovrebbe essere preferito su un semplice array:
std::array<int, 4> f = { 1, 2, 3, 4 };
std::array
sarebbe utile.
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.
È 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::vector
supporta tutti (non direttamente, ma tramite le funzionalità C ++), quindi può in qualche modo essere definito un vettore, ma è solo colloquialismo e ad esempio Vallaray
sottolineato da Bjarne Stroustrup in "Linguaggio di programmazione C ++" supporta alcuni di essi direttamente.
std::vector
non supporta le operazioni aritmetiche e quindi tutte queste proprietà non sono definite per a std::vector
. Quindi a std::vector
non si qualifica come vettore. L'avrei chiamato dynamic_array
o resizable_array
che ti dice che cos'è.
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.
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.
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. "
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".
Immagino che provenga dal termine riga vector . Inoltre, gli informatici amano pensare a nuovi nomi per le cose ...
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.
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.
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 nxm
matrice chiamata A
, dove n
corrisponde al numero di righe e m
corrisponde 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 A
dell'intervallo e non è possibile estendere A
le dimensioni. Ciò significa che non è possibile fare riferimento a un indice di [n + 1]
e / o [m + 1]
.
Ora, un vettore di A
deriva 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 A
con 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.
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.