Wie kann ich einen struct als Schlüssel in einer std::map?
Ich habe folgenden code, aber ich bekomme eine Fehlermeldung auf der letzten Zeile:
struct coord {
int x, y;
bool operator=(const coord &o) {
return x == o.x && y == o.y;
}
bool operator<(const coord &o) {
return x < o.x || (x == o.x && y < o.y);
}
};
map<coord, int> m;
pair<coord, int> p((coord{0,0}),123);
m.insert(p); //ERROR here
Wie kann ich eine Struktur, die als Schlüssel in einer map?
Habe ich versucht den code zu ändern, um diese:
struct coord {
int x, y;
bool const operator==(const coord &o) {
return x == o.x && y == o.y;
}
bool const operator<(const coord &o) {
return x < o.x || (x == o.x && y < o.y);
}
};
Aber ich bin noch immer der folgende Fehler:
C:\Users\tomc\Desktop\g>mingw32-make g++ test.cpp -std=c++0x " In Datei
im Lieferumfang enthalten aus
c:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/string:5 0:0,
aus
c:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/bits/loc
ale_classes.h:42,
aus
c:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/bits/ios
_base.h:43,
aus
c:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/ios:43,
aus
c:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/ostream: 40,
aus
c:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/iostream :40,
aus dem test.cpp:1:
c:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_function.h:
In member function " bool std::less<_Tp>::operator()(const _Tp& const
_Tp&) const [with _ Tp = coord]':
c:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_tree.h:1184:4:
inst antiated von 'std::pair-bool>
std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare,
_Alloc>::_M_insert_unique(const _Val&) [mit _Key
= coord, _Val = std::pair _KeyOfValue =
std::_Select1st >, _Compare =
std::less, _Alloc = std::allocator>]'
c:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_map.h:501:41:
insta ntiated von 'std::pair, std::_Select1st >, _Compare, typename _Alloc::rebind ::value_type>::andere>::iterator, bool> std
::map<_Key, _Tp, _Compare, _Alloc>::insert(const std::map<_Key, _Tp,
_Compare, _ Alloc>::value_type&) [mit _Key = coord, _Tp = int,
_Compare = std::less, _Alloc = std::allocator >, typename std::_Rb_tree<_ - Schlüssel, std::pair, std::_Select1st >, _ Vergleichen,
typename _Alloc::rebind::value_ty pe - >::andere>::iterator =
std::_Rb_tree_iterator >, st d::map<_Key,
_Tp, _Compare, _Alloc>::value_type = std::pair]'
test.cpp:56:12: instanziiert von hier
c:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/bits/stl_function.h:230:22:
er ror: passing 'const coord' as 'this' argument of 'const bool
coord::operator<(co nst coord&)' discards qualifiers mingw32-make: ***
[Spiel] Fehler 1
- Welche Fehler haben Sie?
- Das ist nicht Ihr problem, sondern Ihre operator= muss operator==
- Es sollte
bool operator<(const coord &o) const
- const an der falschen Stelle, nach der argument-Liste nicht vor. Was du getan hast macht der Rückgabetyp const d.h.
const bool
, aber Sie wollen die Methode const. - Lesen Sie die Operator Überladen FAQ-Eintrag. In der Tat, diese sollten geschlossen werden, wie ein dupe, denn es ist alles dort erklärt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie, und machen
operator <
const
:(Ihr
= operator
sollte wohl== operator
undconst
auch)const
wird der Fehler behoben , können Sie das erklären? Dankconst
. Versucht Methoden, die nicht markiert sind, wieconst
in diesem Fall die Ergebnisse in der Fehlermeldung oben (mit XXX discards qualifiers)Bei weitem die einfachste ist, um eine Globale "kleiner als" operator für Ihre struct statt, wie eine member-Funktion.
std::map verwendet - standardmäßig - die "lessthan' Funktor, die wiederum verwendet den globalen "operator" <" für den Schlüssel definiert den Typ der Karte.
Andere Lösung, die verwendet werden können, für Drittanbieter-Daten-Typen, ist die übergabe einer
Comparison object
als Dritten template-parameter.Beispiel
Wie gesagt in den Antwort von Andrii, können Sie eine benutzerdefinierte Vergleich-Objekt, um die
map
statt der Festlegungoperator<
für Ihre Struktur. Da C++11, Sie können auch eine lambda-Ausdruck statt der Festlegung eines Vergleichs-Objekt. Darüber hinaus brauchen Sie nicht zu definierenoperator==
für Ihre struct zu machen, diemap
Arbeit. Als Ergebnis, können Sie Ihre Struktur so kurz wie diese:Und den rest könnte der code wie folgt geschrieben werden:
Code auf Ideone