C++ Hoe vind je de grootste sleutel in een std::map?

Op dit moment is mijn oplossing om de kaart te doorlopen om dit op te lossen.

Ik zie dat er een upper_boundmethode is die deze lus sneller kan maken, maar is er een snellere of beknoptere manier?


Antwoord 1, autoriteit 100%

Het einde:

m.rbegin();

Kaarten(en sets) worden gesorteerd, dus het eerste element is de kleinste, en het laatste element is de grootste. Standaard gebruiken kaarten std::less, maar je kunt de vergelijker veranderen en dit zou natuurlijk de positie van het grootste element veranderen. (Bijvoorbeeld met behulp van std::greaterzou het op begin()plaatsen.

Houd er rekening mee dat rbegineen iterator retourneert. Gebruik m.rbegin()->firstom de daadwerkelijke sleutel te krijgen. Je misschienhet voor de duidelijkheid in een functie inpakken, hoewel ik niet zeker weet of het het waard is:

template <typename T>
inline const typename T::key_type& last_key(const T& pMap)
{
    return pMap.rbegin()->first;
}
typedef std::map</* types */> map_type;
map_type myMap;
// populate
map_type::key_type k = last_key(myMap);

Antwoord 2, autoriteit 10%

De items in een std::map zijn gesorteerd, dus voor een std::map m (ervan uitgaande dat m.empty()onwaar is), kun je gemakkelijk de grootste sleutel krijgen: (--m.end())->first


Antwoord 3

Omdat std::map een associatieve array is, kan men gemakkelijk de grootste of kleinste sleutel vinden. Standaard is de vergelijkingsfunctie minder (<) operator, dus de grootste sleutel is het laatste element op de kaart. Evenzo, als iemand andere vereisten heeft, kan iedereen de vergelijkingsfunctie wijzigen terwijl de kaart wordt gedeclareerd.

std::map< sleutel, Waarde, vergelijk< sleutel,Waarde > >

Standaard vergelijk=std::less


Antwoord 4

Omdat de kaart slechts een AVL-boom is, wordt deze gesorteerd -in oplopende volgorde-. Het element met de grootste sleutel is dus het laatste element en u kunt het verkrijgen met een van de volgende twee methoden:

1.

   largestElement = (myMap.rbegin())-> first; // rbegin(): returns an iterator pointing to the last element
  1. largestElement = (--myMap.end())->first; // end(): returns an iterator pointing to the theortical element following the last element 
    

Antwoord 5

Aangezien je unordered_map niet gebruikt, zouden je sleutels in orde moeten zijn. Afhankelijk van wat je met een iterator wilt doen, heb je twee opties:

  1. Als je een forward-iterator wilt, kun je std::prev(myMap.end())gebruiken. Merk op dat --myMap.end()niet gegarandeerd werkt in alle scenario’s, dus ik zou het meestal vermijden.
  2. Als je in omgekeerde volgorde wilt herhalen, gebruik dan myMap.rbegin()

Other episodes