2012-01-22 12 views
5

Utworzyłem mapę wektorów, który wygląda tak:C++ map <string, wektor <char>> Dostęp

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

Chcę, aby móc dołączyć „Char” do wektora w mapie ale nie może dowiedzieć się, jak uzyskać dostęp do wspomnianego wektora do dołączenia po utworzeniu określonego klucza/wartości (wektor). Jakieś sugestie? I'm iterating over char's i może dodawać dużo do wektora, kiedy idę, więc byłoby miło mieć prosty sposób na zrobienie tego. Dzięki.


Chciałbym, aby wektor na mapie był dołączany, gdy ja idę. Nie potrzebuję oryginalnego wektora ... Muszę tylko zwrócić mapę kluczy/wektorów, które stworzyłem (po wygaśnięciu), aby móc przekazać ją innej funkcji. Do czego służy * na mapie *>? Czy to ponowne oznaczanie wskaźnika? (Jeszcze nie dostałem się na wykład). Potrzebuję również: myMap [key] -> push_back ('s'); lub myMap [klawisz] .push_back ('s'); ??

+0

Czy próbujesz utworzyć tabelę skrótów? –

+0

Aby było jasne - czy chcesz dołączyć do 'myVector', czy też do kopii tego obiektu, który jest zapisany na mapie? Mir Milad Hosseiny odpowiedział, jakby chciał użyć mapy do dołączenia do 'myVector', więc albo ta odpowiedź jest odpowiednia, albo wszystkie pozostałe. –

Odpowiedz

7

Aby dołączyć:

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

Albo użyć myMap.find, ale wtedy trzeba sprawdzić, czy masz end iterator. operator[] zwraca odniesienie do vector.

Ale ta modyfikuje vector przechowywane w map, a nie oryginalny, odkąd przechowywać kopię w map z myMap[key] = myVector;. Jeśli nie tego chcesz, powinieneś przemyśleć swój projekt, a może zapisać (inteligentne) wskaźniki do wektorów na mapie.

+1

W ten sposób tworzona jest kopia wektora i pchany do sklonowanego wektora i oryginalny wektor jest pusty. –

+0

@MirMiladHosseiny: ok, teraz rozumiem, co masz na myśli, ale założyłem, że OP będzie korzystał z wektorów zapisanych na mapie zamiast oryginalnych. –

+0

Co za ....? Nonsens!'myMap [key]' jest lwartością do 'std :: vector ' na mapie. Wyrażenie "myMap [key] .push_back ('c');' jest absolutnie w porządku i do zrobienia! (+1 w odpowiedzi). –

1

Aby uzyskać dostęp do odwzorowanej wartości, która w twoim przypadku jest wektorem, wystarczy podać klucz w nawiasach kwadratowych, tak jak przydzieliłeś tę wartość. Tak, aby dołączyć „a”:

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

W ten sposób tworzona jest kopia wektora, a "a" jest przenoszone do sklonowanego wektora, a oryginalny wektor jest pusty. –

+0

Nie. 'MyMap [key]' zwraca referencję, więc modyfikuje wektor wewnątrz mapy. – Arpegius

+0

@lionbest - OP mówi, że chce "dołączyć" znak "do wektora na mapie", więc uważam, że to prawda. –

3

dał Ci znać kluczowe:

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); 
} 

można również użyć map::operator[] aby uzyskać dostęp do wpisu mapy, ale jeśli klucz nie istnieje, nowy wpis z tego klucza zostanie utworzony:

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

lub po prostu:

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

Musi to być "wektor & v". Tak więc 'v.push_back (ch)' działa na co wskazuje iterator. – Arpegius

+0

@Meysam: lionbest jest poprawny: jeśli nalegasz na odniesienie 'iter-> second' przez inną nazwę (np.' V'), powinieneś, cóż, odwołać się do niego: 'std :: vector & v = iter-> second ; '. –

+0

@Meysam: nawet jeśli korzystasz z operatora indeksu dolnego, który może tworzyć nowe elementy, gdy nie istnieją, nadal musisz użyć odwołania: w przeciwnym wypadku możesz dołączyć do kopii. –

0

Mam nową sugestię. Możesz użyć vector<char>* zamiast vector<char>, aby zebrać wskaźnik wektorów w swoim map. Aby uzyskać więcej informacji, zobacz poniższy kod:

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

Jakie byłyby zalety używania wskaźników do 'std :: vector ' poza prawie na pewno tworzenie wycieku pamięci? –

Powiązane problemy