C ++: нет совпадения для оператора & lt; при попытке перебрать boost :: unordered_map & lt; string, int & gt;

У меня есть следующий код:

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];
}

и когда я пытаюсь скомпилировать, я получаю следующую ошибку, но понятия не имею, почему?

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> >]()

1

Решение

Пытаться:

it != map.end()

как for условие завершения цикла (вместо it < map.end()).

4

Другие решения

В случае итераторов вы должны использовать != оператор:

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

Вы не можете использовать < потому что итератор указывает на память, и вы не можете гарантировать, что память является непрерывной. Вот почему вы ДОЛЖНЫ использовать != сравнить.

3

По вопросам рекламы [email protected]