2009-06-25 3 views
2

Der folgende Code will nicht kompilieren. Siehe die enthaltene Fehlermeldung.<Operator fehlt beim Durchlaufen der C++ Map

Code:

#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(); 
} 

Fehler:

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

ich diese Art von Karte verwendet und Iterieren Prozess vor mehrere Male. Was ist das Problem hier? Wie kann es gelöst werden?

(Der Code sieht sinnlos, aber das ist eine reduzierte Probe, die noch funktionieren sollte)

Antwort

6

Verwenden! = Statt < in Iterator Vergleich.

+0

Ich bin bestürzt, es ist so richtig! Vielen Dank! –

1

Der Operator < ist nur für Direktzugriffs-Iteratoren verfügbar. Da std :: maps normalerweise mit einer Art ausgeglichener Struktur implementiert werden, gibt es normalerweise keinen schnellen Weg herauszufinden, ob ein Iterator auf ein Element vor einem anderen zeigt (obwohl end eine Ausnahme ist).

Ich denke, die Begründung dahinter ist, dass diese mysteriösen Compiler-Fehler Sie zwingen, wieder über Ihren Code nachzudenken und Operator < selbst zu implementieren, wenn Sie feststellen, dass dies der beste Weg ist, um Ihr Problem zu lösen.