简体   繁体   中英

C++: no match for operator< when trying to iterate through boost::unordered_map<string,int>

I have the following code:

boost::unordered_map<std::string, int> map;
map["hello"]++;
map["world"]++;

for(boost::unordered_map<std::string, int>::iterator it = map.begin(); it < map.end(); it++){
    cout << map[it->first];
}

and when I try to compile I get the following error but have no idea why?

error: no match for ‘operator<’ in ‘it < map.boost::unordered::unordered_map<K, T, H, P, A>::end [with K = std::basic_string<char>, T = int, H = boost::hash<std::basic_string<char> >, P = std::equal_to<std::basic_string<char> >, A = std::allocator<std::pair<const std::basic_string<char>, int> >, boost::unordered::unordered_map<K, T, H, P, A>::iterator = boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<const std::basic_string<char>, int> >*, std::pair<const std::basic_string<char>, int> >]()

Try:

it != map.end()

as the for loop termination condition (instead of it < map.end() ).

In case of iterators you must use != operator:

boost::unordered_map<std::string, int>::iterator it = map.begin();
for(; it != map.end(); ++it){
    cout << map[it->first];
}

You cant use < because iterator points to memory, and you cant guarantee that memory is contiguous. That's why you MUST use != compare.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM