2012-10-24 40 views
1

我有以下代碼:C++:不對應的運營商<當試圖通過的boost :: 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

嘗試:

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