2013-10-27 96 views
0

我有一個小問題。 我有一對矢量patternOccurences。這些對是<string,int>,其中string是模式(名稱),int是它出現的索引。我的問題是patternOccurences具有多個具有相同.first(相同模式)但不同int值的對。 例如:該矢量有10個條目。模式「a」的5個和模式「b」的5個。都有不同的指數。現在我想要一張地圖(或類似的東西),這樣我就可以將每個模式(在我的示例中爲「a」和「b」)中的矢量/列表作爲關鍵字,並將它們的索引矢量作爲值。這些索引位於我的向量對中的不同對中,並且我希望int向量中的模式「a」的所有索引都是鍵「a」的值。向量對映射

我嘗試以下:

std::map<std::string,std::vector<int>> occ; 
    for(int i = 0;i<patternOccurences.size();i++){ 
     if(occ.find(patternOccurences.at(i).first)==occ.end()){ 
      occ[patternOccurences.at(i).first]=std::vector<int>(patternOccurences.at(i).second); 
     } 
     else{ 
      occ[patternOccurences.at(i).first].push_back(patternOccurences.at(i).second); 
     } 
    } 

patternOccurences是對和OCC所需的映射向量。首先我檢查是否已經有一個字符串(模式)的條目,如果沒有,我創建一個與矢量作爲價值。如果已經有一個我嘗試push_back與索引的向量。但它似乎沒有正確的工作。對於第一種模式,我得到一個只有0值的向量,而第二種模式只有3個正確的索引,其他的索引也是0。

我希望你能幫助我。 Kazoooie

+0

你不需要使用'find'。 'map :: operator []''如果鍵還不存在,則默認構造該值。 'for(const auto&pair:patternOccurences)occ [p.first] .push_back(p.second);''是你所需要的。 – jrok

+0

謝謝!欣賞它。 – R6D1H2

回答

2

你以錯誤的方式調用constructor for the vector

std::vector<int>(patternOccurences.at(i).second); 

這將創建具有N個默認的構造元素的向量,而不是與值N.一個元素矢量您需要:

std::vector<int>(1, patternOccurences.at(i).second); 

這應該可以解決問題,但是您的代碼不必那麼複雜。下面會工作得很好:

for(int i = 0;i<patternOccurences.size();i++){ 
    occ[patternOccurences.at(i).first].push_back(patternOccurences.at(i).second); 
} 

或C++ 11中,更簡單:

for(auto& p:patternOccurences) { 
    occ[p.first].push_back(p.second); 
} 
+0

哦,你是對的。謝謝。 – R6D1H2

0

你要求的是STL中已經存在的,它叫std::multimap(和std::unordered_multimap)。

看一看here。基本上它是一張允許更多值具有相同鍵的地圖。

std::multimap<std::string, int> occ; 

occ.insert(std::pair<std::string,int>("foo", 5)); 
occ.insert(std::pair<std::string,int>("foo", 10)); 

std::pair<std::multimap<std::string,int>::iterator, std::multimap<std::string,int>::iterator> group = occ.equal_range("foo"); 
std::multimap<std::string,int>::iterator it; 

for (it = ret.first; it != ret.second; ++it) { 
.. 
} 
+0

這就是我一直在尋找的。非常感謝! – R6D1H2

0

更改本聲明

occ[patternOccurences.at(i).first]=std::vector<int>(patternOccurences.at(i).second); 

occ[patternOccurences.at(i).first]=std::vector<int>(1, patternOccurences.at(i).second); 
+0

對!非常感謝你。 – R6D1H2