2017-11-16 12 views
2

(string, Object)의 문자열과 unordered_map이 있습니다. 나는 이미 내가지도를 반복하고있는 몇 가지 코드를 가지고 :C++ unordered_map 단일 객체에 대한 반복자

문자열이 아닌 비어있는 문자열 인 경우 다른지도 내에서 발견했을 때 나는 루프의 내부 부분을 그것을 수정할
for(auto& item : map) { 
    do_something; 
} 

empty 맵의 모든 항목에 대해이를 수행하십시오.

if(!string.empty()){ 
    item = map.find(string); 
    do_something; 
} 
else { 
    for(auto& item : map) { 
     do_something; 
    } 
} 

do_something을 다시 작성하거나 별도의 함수를 만들지 않고도이 작업을 수행 할 수 있습니까?

+0

'do_something'을 로컬 람다 함수에 넣으시겠습니까? – StoryTeller

+0

for 루프가 그대로 유지되도록 map.find()에서 쌍의 반복자를 만들 수 있습니까? – 250

+0

나는 당신의 생각을 따를 지 모른다. – StoryTeller

답변

3

의견에 제시된 생각을 따르십시오. 루프의 범위를 특정 범위 (반복자로 정의)에 대한 일반 for 루프로 바꿀 수 있습니다. 이를 정의하려면 다음과 같은 것이 필요합니다.

auto begin = map.begin(), end = map.end(); // The whole map 

if(!string.empty()) 
    std::tie(begin, end) = map.equal_range(string); 
    // constrain range to the single element 

for(; begin != end; ++begin) { // loop over it 
    auto& item = *begin; 
    // Do something 
} 

위의 별은 std::unordered_map::equal_range입니다.

+0

이것은 시간의 복잡성을 제외하면 괜찮아 보입니다. 나는 내부에 대해 잘 알고 있지 않습니다. equal_range 시간의 복잡성은 동일합니까? – 250

+0

@ sum250 -이 컨테이너에 대한 찾기와 동일합니다 (중복이 허용되지 않음). – StoryTeller