2009-03-26 19 views
14

Czy istnieje powód, dla którego przekazanie odniesienia do mapy STL jako const powoduje przerwanie pracy operatora []? Otrzymuję ten błąd kompilatora (gcc 4.2) kiedy używać const:C++ const std :: map reference nie kompiluje się

error: no match for ‘operator[]’ in ‘map[name]’

Oto prototyp funkcji:

void func(const char ch, std::string &str, const std::map<std::string, std::string> &map); 

A, należy wspomnieć, że nie ma problemu, kiedy wyjąć const słowo kluczowe przed std :: map.

Jeśli zostałem poprawnie poinstruowany, operator [] wstawi nową parę do mapy, jeśli nie znajdzie klucza, co oczywiście wyjaśniłoby, dlaczego tak się dzieje, ale nie mogę sobie tego wyobrazić byłoby to kiedykolwiek dopuszczalne zachowanie.

Jeśli istnieje lepsza metoda, na przykład użycie znajdź zamiast [], byłbym wdzięczny. Wydaje się, że nie mogę znaleźć pracy albo ... Otrzymuję const niedopasowanych błędów iteratora.

Dzięki.

Odpowiedz

26

Tak, nie można użyć numeru operator[]. Użyj find, ale należy pamiętać, że zwraca const_iterator zamiast iterator:

std::map<std::string, std::string>::const_iterator it; 
it = map.find(name); 
if(it != map.end()) { 
    std::string const& data = it->second; 
    // ... 
} 

To jak ze wskaźnikami. Nie można przypisać int const* do int*. Podobnie nie można przypisać const_iterator do iterator.

6

Podczas korzystania z operatora [], std :: map szuka pozycji z podanym kluczem. Jeśli go nie znajdzie, utworzy go. Stąd problem z const.

Użyj metody wyszukiwania, a wszystko będzie w porządku.

Czy możesz napisać kod o tym, jak próbujesz użyć find()? Właściwy sposób byłoby:

if(map.find(name) != map.end()) 
{ 
    //... 
} 
2

Prawdopodobnie dlatego, że jest w std :: map nie const operator []. operator [] doda element, którego szukasz, jeśli go nie znajdzie. Dlatego użyj metody find(), jeśli chcesz szukać bez możliwości dodawania.

2

Na swoim "const błędów niedopasowane iterator":

find() ma dwa przeciążeń:

 iterator find (const key_type& x); 
const_iterator find (const key_type& x) const; 

My przypuszczenie jest to, że dostajesz to błąd, ponieważ robisz coś takiego przypisanie non-const iterator (po lewej) do wyniku find() rozmowy na const mapie:

iterator<...> myIter /* non-const */ = myConstMap.find(...) 

To spowoduje błąd, ale może nie ten, który widzisz.

3

Jeśli używasz C++ 11, std::map::at powinien działać dla Ciebie.

Powód: std::map::operator[] nie działa, ponieważ w przypadku klucza, którego szukasz, nie istnieje na mapie, wstawi nowy element za pomocą dostarczonego klucza i zwróci do niego odnośnik (zobacz link dla szczegółów). Nie jest to możliwe na const std :: map.

Metoda "at" spowoduje jednak zgłoszenie wyjątku, jeśli klucz nie istnieje. Biorąc to pod uwagę, prawdopodobnie dobrym pomysłem jest sprawdzenie istnienia klucza za pomocą metody std :: map :: find przed próbą uzyskania dostępu do elementu za pomocą metody "at".

Powiązane problemy