2016-11-06 3 views
1

내 unordered_map도는 다음과 같이 설정 한 :카운트 번호 unordered_map도

unordered_map<int, deque<my_struct>> table; 

내 프로그램에 대한 값을 읽을, 나는 보통 수행

table[int].push_back(obj); 

내가 할 수 있기를 원한다면 2 개의 정수 변수가 주어진다면 두 개 사이에 발생하는 키의 수를 찾을 수 있기를 원합니다.

내가 키 (45)의 값과 65 사이에 보는 (나는 현재 쓰기 위해 노력하고있어) 내 검색 기능을 실행하면 내 테이블에 내가

table[49].push_back(obj); 
    table[59].push_back(obj); 
    table[60].push_back(obj); 

같은 코드가 있다면 그래서, 내가해야 3 결과가 있습니다.

저는 효율적인 방법으로 어떻게해야하는지 정확히 알지 못합니다. 어떤 아이디어라도 도움이 될 것입니다. 당신보다.

+2

"unordered_map"입니다 - "사이의 사물"이라는 개념은 본질적으로 난센스입니다 (다른 것들 사이에 집계하는 데 사용할 수있는 순서가 있음을 의미합니다). 얻는 값은 컴파일러에 따라 다를 수 있으며 항목을 'unordered_map'에 삽입 할 때 변경할 수 있습니다. 'map'을 사용한다면 그것은 적어도 합리적인 질문입니다. – druckermanly

+0

알았어, 나 한테 그걸 정리 해줘서 고마워! 대신지도를 사용하여이를 수행하는 방법을 알아 보겠습니다. – MMM

답변

1

당신이 std::unordered_map를 사용하는 경우 당신이 모든 정수 65-45과 키가 unordered_map에 존재하는지 확인하기 위해 find을 사용하여 이상 선택하지만 루프에 있다고 생각하지 않습니다

using my_table = std::unordered_map<int, std::deque<my_struct>>; 

int count(const my_table& table, int begin, int end) { 
    int sum = 0; 
    for (int i = begin; i != end; ++i) { 
    auto find_result = table.find(i); 
    if (find_result != table.end()) 
     sum++; 
    } 
    return sum; 
} 

그러나이 매우 효율적이지 않을 수 있습니다. 대신 요소 때문에이보다 효율적으로 달성 할 수 정렬됩니다 std::map를 사용하는 경우 :

using my_table = std::map<int, std::deque<my_struct>>; 

int count(const my_table& table, int begin, int end) { 
    auto begin_itr = table.lower_bound(begin); 
    if (begin_itr == table.end()) 
     return 0; 
    auto end_itr = table.lower_bound(end); 
    return std::distance(begin_itr, end_itr); 
} 

나는 std::map::lower_bound 기능을 사용했습니다.

지도가 얼마나 희귀한지에 따라 std::vector<std::deque<my_struct>> 같은 것을 평면지도로 사용하는 것을 고려해 볼 수도 있습니다.

Live demo.

+0

자세한 답변을 보내 주셔서 감사합니다! 매우 분명했습니다. – MMM