To moja implementacja klasy Box:W jaki sposób jest wdrażana funkcja std :: map, aby wymagać, aby jej typ klucza był porównywalny?
class Box {
friend ostream& operator<<(ostream &os, const Box &b);
friend bool operator<(const Box &left, const Box &right);
public:
Box(int i, double d);
~Box();
private:
int i;
double d;
};
Box::Box(int _i, double _d):i(_i), d(_d) {}
Box::~Box() {}
bool operator<(const Box &left, const Box &right)
{
return (left.i < right.i);
}
ostream& operator<<(ostream &os, const Box &b)
{
os << b.d;
return os;
}
Ten kod testowy:
int main()
{
Box b1(3,2), b2(2,1), b3(0, 9);
map<Box, int> bmap;
bmap.insert(pair<Box,int>(b1, 10));
bmap.insert(pair<Box,int>(b2, 10));
bmap.insert(pair<Box,int>(b3, 10));
for (map<Box,int>::iterator iter = bmap.begin(); iter != bmap.end(); ++iter)
{
cout << iter->first << " ";
}
cout << endl;
return 0;
}
Jeśli usunąć definicję operatora < od klasy Box, kompilator będzie narzekać (błąd) jeśli próbuję wstawić obiekt Box do std :: map.
Mam pewne doświadczenie z Javą i wiem, że w podobnych przypadkach muszę pozwolić, aby Box implement Comarable. Kompilator Java sprawdzi tę umowę podczas kompilacji, ponieważ Map w Javie wymaga, aby jej typ klucza był zgodny z porównywalne.
I jeśli chcemy zdefiniować własny typ mapy w Javie, po prostu trzeba napisać:
public class MyMap<K extends Comparable<K>, V>
Więc moje pytanie brzmi, czy chcę, aby zaimplementować własny typ mapy (powiedzmy, MyMap) w C++, jak zdefiniować MyMap, aby kompilator wiedział podczas kompilacji, że "MojaMapa wymaga, aby jej typ klucza miał swoją własną przeciążoną definicję operatora <"?
Zapisujesz szablon tak, jakby typ obsługiwał 'operator <'. Jeśli nie, kompilator będzie narzekał, gdy spróbujesz utworzyć szablon na typie. –
Typowym rozwiązaniem C++ jest ** nie ** zdefiniowanie własnego typu mapy, ale użycie bezpośrednio "std :: map". –
@John Dibling Nie próbuję definiować własnego typu mapy. Chciałem tylko dowiedzieć się więcej o tym, jak to jest zaimplementowane w C++. : D – lqr