2009-06-25 8 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

私は大げさですが、そうです!ありがとう! –

1

オペレータ<は、ランダムアクセスイテレータでのみ使用できます。 std :: mapsは通常、ある種の均衡のとれたツリーを使って実装されているので、ある反復子が別の要素の前にある要素を指しているかどうかを調べる高速な方法はありません。

私は、これらの不思議なコンパイラのエラーにより、あなたのコードについてもう一度考えて、オペレータ<を実装することがあなたの問題を解決する最善の方法だと分かったと思います。

関連する問題