2012-01-22 20 views
5

ho creato una mappa di vettori che assomiglia a questo:C++ mappa <string, vettore <char>> accesso

map<string, vector<char> > myMap; 
string key = "myKey"; 
vector<char> myVector; 
myMap[key] = myVector; 

io voglio essere in grado di aggiungere 'char di' al vettore nella mappa, ma ho non riesco a capire come accedere a detto vettore per aggiungere una volta che la particolare chiave/valore (vettore) è stata creata. Eventuali suggerimenti? Sto iterando su char e potrei aggiungere molto al vettore mentre vado, quindi sarebbe bello avere un modo semplice per farlo. Grazie.


Desidero che il vettore sulla mappa venga aggiunto mentre procedo. Non ho bisogno del vettore originale ... Devo solo restituire la mappa di chiave/vettore che ho creato (dopo la sospensione) in modo che possa passarla a un'altra funzione. Cosa fa * in map *>? Quello è il riferimento a un puntatore? (Non sono ancora arrivato in conferenza) Inoltre, ho bisogno di: myMap [chiave] -> push_back ('s'); o myMap [chiave] .push_back ('s'); ??

+0

Si sta tentando di creare una tabella hash? –

+0

Per essere chiari - vuoi aggiungere a 'myVector', o alla copia di quell'oggetto che è memorizzato nella mappa? Mir Milad Hosseiny ha risposto come se volessi usare la mappa per aggiungere a 'myVector', quindi o quella risposta è applicabile, o tutte le altre sono. –

risposta

7

Per aggiungere:

myMap[key].push_back('c'); 

Oppure utilizzare myMap.find, ma poi si deve verificare se si ottiene un end iteratore. operator[] restituisce un riferimento allo vector.

Ma questa modifica il vector memorizzato nel map, non è quella originale, dal momento che hai memorizzato una copia nella map con myMap[key] = myVector;. Se questo non è ciò che desideri, dovresti riconsiderare il tuo design e magari memorizzare puntatori (intelligenti) su vettori nella tua mappa.

+1

In questo modo, viene creata una copia del vettore e un vettore trasferito al vettore clonato e il vettore originale è vuoto. –

+0

@MirMiladHosseiny: ok, ora capisco cosa intendi, ma ho pensato che l'OP avrebbe usato i vettori memorizzati nella mappa piuttosto che l'originale. –

+0

Cosa ....? Senza senso!'myMap [chiave]' è un lvalue per 'std :: vector ' nella mappa. L'espressione 'myMap [chiave] .push_back ('c');' è assolutamente valida e la strada da percorrere! (+1 sulla risposta). –

1

Per accedere al valore mappato, che nel tuo caso è un vettore, basta fornire la chiave tra parentesi quadre come hai fatto per assegnare il valore. Quindi, per aggiungere 'a':

myMap[key].push_back('a'); 
+0

In questo modo, viene creata una copia del vettore e 'a' viene spinto sul vettore clonato e il vettore originale è vuoto. –

+0

No. 'myMap [chiave]' restituisce un riferimento, quindi modifica il vettore all'interno della mappa. – Arpegius

+0

@lionbest - l'OP dice che vuole "aggiungere 'caratteri' al vettore nella mappa", quindi credo che sia giusto. –

3

dato conosce la chiave:

string key = "something"; 
char ch = 'a'; // the character you want to append 

map<string, vector<char> >::iterator itr = myMap.find(key); 
if(itr != myMap.end()) 
{ 
    vector<char> &v = itr->second; 
    v.push_back(ch); 
} 

si potrebbe anche utilizzare il map::operator[] per accedere alla voce della mappa, ma se la chiave non esiste, un sarà creata nuova voce con quella chiave:

vector<char> &v = myMap[key]; // a map entry will be created if key does not exist 
v.push_back(ch); 

o semplicemente:

myMap[key].push_back(ch); 
+0

Deve essere 'vector & v'. Quindi il 'v.push_back (ch)' funziona su quello che punta l'iteratore. – Arpegius

+0

@Meysam: lionbest è corretto: se insisti a fare riferimento a 'iter-> second' con un altro nome (es.' V') devi, beh, fare riferimento a: 'std :: vector & v = iter-> secondo ; '. –

+0

@Meysam: anche quando si utilizza l'operatore di pedice che può creare nuovi elementi quando non esistono, è comunque necessario utilizzare un riferimento: in caso contrario si aggiunge a una copia. –

0

Ho un nuovo suggerimento. È possibile utilizzare vector<char>* anziché vector<char> per raccogliere il puntatore di vettori nel proprio map. Per ulteriori informazioni, vedere il codice seguente:

map<string, vector<char>* > myMap; 
string key = "myKey"; 
vector<char>* myVector = new vector<char>(); 
myMap[key] = myVector; 
myMap[key]->push_back('S'); 
+3

Quale sarebbe il vantaggio di utilizzare i puntatori a 'std :: vector ' oltre quasi certamente a creare una perdita di memoria? –

Problemi correlati