2009-06-25 58 views
2

以下代碼不想編譯。看到包含的錯誤信息。<通過C++映射迭代時缺少的操作符

代碼:

#include <map> 
#include <vector> 
#include <iostream> 

class MapHolder { 
public: 
    std::map<std::vector<std::string>,MapHolder> m_map; 

    void walk_through_map() { 
     std::map<std::vector<std::string>,MapHolder>::iterator it; 
     for(it = m_map.begin(); it < m_map.end(); ++it) { 
      it->second.print(); 
     } 
    } 

    void print() { std::cout << "hey" << std::endl; } 
}; 

int 
main(int argc, char *argv[]) 
{ 
    MapHolder m; 
    m.walk_through_map(); 
} 

錯誤:

$ g++ test.cc -O test 
test.cc: In member function 'void MapHolder::walk_through_map()': 
test.cc:12: error: no match for 'operator<' in 'it < ((MapHolder*)this)->MapHolder::m_map.std::map<_Key, _Tp, _Compare, _Alloc>::end [with _Key = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Tp = MapHolder, _Compare = std::less<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, _Alloc = std::allocator<std::pair<const std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, MapHolder> >]()' 

我之前多次使用此類型的映射和迭代過程。這裏有什麼問題?它如何解決。

(代碼看起來毫無意義的,但是這是它仍然應該工作減少的樣品)

回答

6

使用!=而不是<在迭代比較。

+0

我很尷尬,這是對的!謝謝! – 2009-06-25 06:12:18

1

運營商<只適用於隨機訪問迭代器。由於std :: maps通常使用某種平衡樹來實現,因此通常沒有快速的方法來確定一個迭代器是否指向另一個元素(儘管end是一個例外)。

我想這背後的原因是,這些神祕的編譯器錯誤迫使你再次考慮你的代碼,如果你發現這是解決你的問題的最好方法,你自己實現運算符<。