C'è qualche ragione per l'operatore std :: vector [] per restituire un riferimento invece di inserire un nuovo elemento?
std::vector::operator[]
è implementato in un modo simile matrice perché std::vector
è un contenitore di sequenza (cioè, array simili). Non è possibile accedere agli array standard per i tipi interi senza limiti. Analogamente, l'accesso a std::vector::operator[]
con un indice esterno alla lunghezza del vettore non è consentito neanche. Quindi, sì, i motivi per cui non è implementato come chiedete è perché in nessun altro contesto, gli array in C++ agiscono in questo modo.
std::map::operator[]
non è un contenitore di sequenza. La sua sintassi lo rende simile agli array associativi in altre lingue. In termini di C++ (e del suo predecessore, C), lo map::operator[]
è solo zucchero sintattico. È la "pecora nera" della famiglia operator[]
, nonstd::vector::operator[]
.
La parte interessante della specifica C++ riguardante è che l'accesso a una mappa con una chiave che non esiste, utilizzando std::map::operator[]
, aggiunge un elemento alla mappa. Così,
#include <iostream>
#include <map>
int main(void) {
std::map<char, int> m;
m['a'] = 1;
std::cout << "m['a'] == " << m['a'] << ", m.size() == " << m.size() << std::endl;
std::cout << "m['b'] == " << m['b'] << ", m.size() == " << m.size() << std::endl;
}
risultati in:
m['a'] == 1, m.size() == 1
m['b'] == 0, m.size() == 2
Vedi anche: Difference between map[] and map.at in C++?:
[map::at
] genera un'eccezione se la chiave non esiste, restituisce find
aMap.end()
se l'elemento non esiste e il valore operator[]
inizializza un nuovo valore per la chiave corrispondente se non v alue esiste lì.
Il modo in cui 'std :: map :: operator []' è effettivamente implementato causa già abbastanza confusione. UB va bene per 'std :: vector' accede ai limiti. –
Immaginate cosa succederebbe se scrivessimo 'some_vector [1000]' mentre 'some_vector' fosse della dimensione 10. Beh, non so cosa immaginare con le 990 voci nel mezzo. –
@NickyC: Ma una mappa ha lo stesso problema! –