2012-01-22 2 views
5

Я создал карту векторов, выглядит следующим образом:C++ карта <строка, вектор <char>> доступ

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

Я хочу, чтобы иметь возможность добавлять «Чара» к вектору на карте, но я не может понять, как получить доступ к указанному вектору для добавления, когда был создан конкретный ключ/значение (вектор). Какие-либо предложения? Я повторяю char и могу добавить много к вектору, поскольку я иду, поэтому было бы неплохо иметь простой способ сделать это. Благодарю.


Я хочу, чтобы вектор на карте прилагался, когда я иду. Мне не нужен исходный вектор ... Мне просто нужно вернуть карту ключа/вектора, которую я создал (после ее появления), чтобы передать ее другой функции. Что делает * в карте *>? Это переопределение указателя? (Я еще не читал лекции) Также мне нужно: myMap [key] -> push_back ('s'); или myMap [ключ] .push_back ('s'); ??

+0

Вы пытаетесь создать хеш-таблицу? –

+0

Чтобы быть ясным - вы хотите добавить к 'myVector', или к копии этого объекта, который хранится на карте? Мир Милад Хоссейни ответил так, как будто вы хотите использовать карту для добавления в 'myVector', поэтому либо этот ответ применим, либо все остальные. –

ответ

7

Для добавления:

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

Или использовать myMap.find, но тогда вы должны проверить, получаете ли вы в end итератор. operator[] возвращает ссылку на vector.

Но это изменяет vector хранящиеся в map, не оригинал один, так как вы сохранили копию в map с myMap[key] = myVector;. Если это не то, что вы хотите, вы должны переосмыслить свой дизайн и, возможно, сохранить (умные) указатели на векторы на своей карте.

+1

Посредством этого создается копия вектора, а вектор клонированных векторных и исходных векторов пуст. –

+0

@MirMiladHosseiny: Хорошо, теперь я понимаю, что вы имеете в виду, но я предположил, что OP будет использовать векторы, хранящиеся на карте, а не оригинальные. –

+0

Что ...? Бред какой то!'myMap [key]' является lvalue для 'std :: vector ' на карте. Выражение 'myMap [key] .push_back ('c');' абсолютно нормально и путь! (+1 в ответе). –

1

Чтобы получить доступ к отображаемому значению, которое в вашем случае является вектором, вы просто указываете ключ в квадратных скобках, как и вы, чтобы присвоить значение. Таким образом, чтобы добавить «а»:

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

При этом создается копия вектора, и 'a' нажата на клонированный вектор, а исходный вектор пуст. –

+0

№ 'myMap [key]' возвращает ссылку, поэтому она меняет вектор внутри карты. – Arpegius

+0

@ lionbest - OP говорит, что хочет «добавить« символ »к вектору на карте, поэтому я считаю, что это правильно. –

3

Учитывая вы знаете, ключ:

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

вы можете также использовать map::operator[] для доступа к записи на карту, но если ключ не существует, новая запись с помощью этого ключа будет создан:

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

или просто:

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

Он должен быть 'vector & v'. Поэтому 'v.push_back (ch)' работает над тем, на что итератор указывает. – Arpegius

+0

@Meysam: lionbest верен: если вы настаиваете на ссылке на 'iter-> second' на другое имя (например,' v'), вам нужно, ну, ссылаться на него: 'std :: vector & v = iter-> second ; '. –

+0

@Meysam: даже при использовании оператора индекса, который может создавать новые элементы, когда их не существует, вам все равно нужно использовать ссылку: иначе вы добавляете копию. –

0

У меня есть новое предложение. Вы можете использовать vector<char>* вместо vector<char>, чтобы получить указатель векторов в вашем map. Для получения дополнительной информации см. Следующий код:

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

Каково было бы использование указателей на 'std :: vector ' почти наверняка создавая утечку памяти? –

Смежные вопросы