2013-02-08 77 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 2013-02-08 14:06:55

回答

2

使用這種嵌套類型與使用簡單地圖或矢量的工作沒有多大區別。所以地圖的一個元素就是一個矢量。獲取此元素並將其用作矢量。

pos = mapGraph.find(string);

返回map的迭代器。

(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]'不是指針/迭代器類型,所以用'operator->'訪問'DataMemberofmyClass'將不起作用:) – us2012 2013-02-08 14:08:11

+0

@ us2012我站修正 – 2013-02-08 14:08:40

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]; 
// ... 

關於唯一的例外是,如果你」 不是修改了 元素,並且您不想在條目爲空時創建該條目。 在這種情況下,你需要find和測試:

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