2012-10-24 3 views
1

У меня есть следующий код:C++: не подходит для оператора <при попытке перебрать повышения :: unordered_map <string,int>

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()' – sje397

ответ

4

Try:

it != map.end() 

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

+0

, почему он Aly

+0

@aly Как компилятор сказал, потому что не определен 'operator <': – sje397

+1

... как карта, ну, неупорядоченная. :) – Reunanen

3

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

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

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

+0

Векторный итератор, например, определяет оператор <, поэтому мы можем использовать это условие завершения. Я думаю, это зависит от того, как реализован итератор. – Aly

+0

Итератор - это интерфейс! = Допустимо всегда, тогда < –

+0

http://msdn.microsoft.com/en-us/library/54skkak1.aspx – Reunanen

 Смежные вопросы

  • Нет связанных вопросов^_^