2013-10-31 55 views
3

循環遍歷boost unordered_multimap中唯一鍵的最簡單方法是什麼?通過唯一鍵提升unordered_multimap循環

例如,我有這樣的:

std::set<int> used; 
for (auto p : valuesMap) 
{ 
    if (used.count(p.first)) 
     continue; 
    used.insert(p.first); 

    auto range = valuesMap.equal_range(p.first); 
    if (p.first) 
    for (auto v = range.first; v != range.second; ++v) 
     //do something; 
} 

有沒有更好的方式來做到這一點。似乎唯一的鍵應該已經被無序映射所知道。

回答

3

你想要做的是找到一種方法來獲得某個鍵後面的迭代器。在multimap我通常使用upper_bound。但由於unordered_multimap沒有 - 我將不得不使用equal_range.second

for (auto iter=valueMap.begin(); 
    iter!=valueMap.end(); 
    iter=ValueMap.equal_range(iter->first)->second){ 
    uniq_key=iter->first; 
    // Do whatever you want with uniq_key 
} 

但你的例子是怪我 - 因爲你去了所有的元素。如果我想寫你的代碼,做你做的,這是我該怎麼做:

for (auto iter=valueMap.begin() 
    iter!=valueMap.end(); 
    ){ // Notice the lack of ++iter!!! 
    auto end=valueMap.equal_range(ier->first)->second; 
    for (;iter!=end;++iter) 
    // Do something 
} 
+0

第二件事似乎是我需要的東西。讓我測試一下,我會給你檢查 – gsf

+0

yeap,我剛剛替換了'for(; iter!= end; ++ iter)//用'do {//做某事; } while(++ iter!= end);'以避免一個無意義的檢查,但其他方法可行。 – gsf