Ta odpowiedź SO mówi, że mapa STL z wektorem dla klucza wektor może być używany jako klucz. Więc kiedy używamy wektora jako klucza. Jak to faktycznie działa, skoro klucz musi być unikalny, więc kiedy wstawimy inny wektor z tymi samymi elementami, czy map
sprawdzanie duplikatu elementu po elemencie lub nazwa wektora coś określi? Podobnie jak nazwa tablicy reprezentuje adres podstawowy. Tak więc tablica może być używana jako klucz, ponieważ adres podstawowy może być użyty jako klucz w tym przypadku, ale jaki jest klucz w przypadku wektora. Jak to działa wewnętrznie.
Ponieważ kiedy drukuję nazwę wektora, pojawia się błąd
vector<int> v;
cout<<v; //error
has operators == and <
jak to pomaga? moim pytaniem było sprawdzenie, czy zduplikowane elementystd::vector
jako kluczastd::map
. Płacisz za to, czego używasz . Można to zrobić i być może istnieją do tego pewne przypadki użycia, ale z pewnością możesz zmienić wybraną strukturę danych. Kontenery STL są zaprojektowane tak, aby były maksymalnie wszechstronne i użyteczne w dowolny sposób, w jaki użytkownik może chcieć z nich korzystać.std::map
skopiuje zarówno klucz, jak i wartość do siebie.std::unordered_map
może przechowywać skrót klucza.Odpowiedzi:
Istnieje przeciążony operator <dla szablonu klasy std :: vector.
oparty na standardowym algorytmie
std::lexicographical_compare
.Oto program demonstracyjny.
Jego wydajność to
Tak więc klasa może być używana jako klucz na mapie.
Domyślnie mapa szablonów klas używa obiektu funkcji std :: less, który z kolei używa operatora <
Jednak nie ma przeciążonego operatora << dla szablonu klasy std :: vector.
źródło
Nazwa obiektu i treść tego obiektu są zawsze rzeczami niepowiązanymi.
operator ==
forstd::vector
najpierw porównuje długość wektorów, a następnie używa każdego z jego elementówoperator ==
.operator <
porównuje elementy w wektorze leksykograficznie, tzn. zwracax[i] < y[i]
pierwszy nierównoprawny element w wektorachx
iy
.Są to wymagania
std::map
dla typu używanego jakoKey
. Ponieważstd::vector
spełnia oba, może być używany przez asKey
. Zauważ, że typ zarządzany przez wektor musi również mieć przeciążonych operatorów, aby to działało (ponieważstd::vector
polega na tym, że operatorzy wdrażają własne operatory).źródło