2013-02-08 3 views
1

Я пытаюсь создать карту, содержащую строковый ключ и вектор myClass.хранить объекты в векторе, который находится внутри карты в C++

std::map<string,vector<myClass>> m; 

Мне также необходимо заполнить вектор и карту динамически (считывая значения из файла).

class myClass{ 
string dataMember1; 
... 
myClass() 
    { ... } 
}; 

Как я могу приступить к этому?

Также я хочу иметь доступ к объектам в векторе на основе строкового ключа.

, например:

std::map<string,vConnect>::iterator pos; 
pos = mapGraph.find(string); 
cout<<(pos->second)[0]->DataMemberofmyClass 

будет (POS-> второй) [0] указывают на первый объект MyClass, хранящуюся в векторе ??

Благодаря

+0

, что это ваша проблема именно?где вы занялись? – ogzd

ответ

2

Работа с такими типами вложенными не сильно отличается от работы с простой картой или вектор. Таким образом, элемент карты является вектором. Получите этот элемент и используйте его как вектор.

pos = mapGraph.find(string);

Возвращает итератор в карте.

(pos->second) 

Является ли вектор, который является значением на этом итераторе. Поэтому просто используйте его, как вы бы использовали vector. Ваш код верен, кроме того, что вы никогда не проверяли, действительно ли элемент найден.

std::map<string,vConnect>::iterator pos; 
pos = mapGraph.find(string); 
if (pos != mapGraph.end()) { 
cout<<(pos->second)[0].DataMemberofmyClass 
} 

EDIT (Спасибо us2012): на самом деле вы имели небольшую ошибку (pos->second)[0] является объект MyClass так получить доступ к его членам, используя . не используя ->.

+2

... вам не хватает того, что '(pos-> second) [0]' не является типом указателя/итератора, поэтому доступ к 'DataMemberofmyClass' с' operator-> 'не будет работать :) – us2012

+0

@ us2012 Я стою исправленный –

5

Как правило, когда отображаемый тип является контейнером, только с использованием [] везде работает хорошо; если запись не присутствует, то он будет с пустым контейнером, так что такие вещи, как:

m[key].push_back(newElement); 

или

m[key].begin(), m[key].end() 

или даже:

if (!m[key].empty()) 
    doSomethingWith(m[key].second[0]); 

работают корректно. Если вы делаете ряд операций на же элемента (как в последних двух случаях), вы можете провести его в ссылке:

std::vector<MyClass>& elem = m[key]; 
// ... 

О единственным исключением будет, если вы» re не, изменяющий элемент , и вы не хотите создавать запись, если она пуста. В этих случаях вам нужно find и тест:

std::map<std::string, std::vector<MyClass>>::const_iterator 
       entry = m.find(key); 
if (entry != m.end()) { 
    std::vector<MyClass>& elem = entry->second; 
    // ... 
}