2013-03-27 2 views
1

나는 뒤로 비 반복으로 키를 통해 반복에 특히 관심이 있어요 :다른 함수에 멀티 맵 반복 논리를 적용 할 수 있습니까?

#include <map> 
#include <iostream> 
std::multimap<int,int> myMap = { 
    {1,2}, {1,2}, {2,2}, {2,2}, {3,2}, 
}; 

int main() { 
    using namespace std; 
    cout << "the keys backwards:" << endl; 
    typedef multimap<int, int> multimap_type; 
    typedef std::reverse_iterator<multimap_type::iterator> reverse_iterator; 
    for (auto it = myMap.rbegin(), end = myMap.rend(); it != end; it = reverse_iterator(myMap.lower_bound(it->first))) 
    { 
    cout << it->first << endl; 
    } 
} 

당신은 내가 다른 것들 사이 multimap에 이름을 세 번 반복해야 볼 수 있듯이. 모든 것을 처리하기 위해 자체 함수를 작성한 다음 while 루프 또는 range for loop를 호출 할 수 있습니까? 그와 마찬가지로 : it

while((auto it = myIterFunc(myMap)) { 
    //... 
} 

for (auto it : myIterFunc(myMap)) { 
    //... 
} 

답변

2
for (auto it : myIterFunc(myMap)) { 

이름과 myIterFunc 당신이 새로운 범위 기반 for 루프에 대해 혼란스러워 의미한다. 변수 it은 반복자가 아니며 범위의 요소입니다. 함수 myIterFunc은 반복자를 반환하지 않아야합니다. 범위와 비슷한 형식을 반환해야합니다. 즉, 원하는 범위에서 반복을 허용하는 begin()end() 멤버가 있어야합니다.

당신은 reverse에 그것을 통해 루프에 Boost.Range에게 어댑터를 사용할 수 있습니다 : 당신은 중복 키를 건너 뛸 수있는 filter adaptor와 그 결합 할 수

#include <boost/range/adaptors.hpp> 
for (auto& val : boost::adaptors::reverse(myMap)) 
    cout << val.first << endl; 

. (uniqued adaptor이 있지만 키 검사 만하는 대신 ==을 사용하여 고유성을 결정합니다)

관련 문제