2013-10-31 2 views
3

부스트 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을 사용합니다.

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 
} 

을하지만 당신의 예는 나에게 이상한 - 당신은 모든 요소를 ​​통해 이동 때문에 : 나는 equal_range.second을 사용해야합니다 -하지만 unordered_multimap 때문에 그이 없습니다. 코드를 작성하고 코드를 작성하려고한다면 다음과 같이하십시오.

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 {// do somehting; } while (++ iter! = end);'무의미한 체크를 피하기 위해서입니다. – gsf

관련 문제