2 Stimmen

STL Karte: Was bedeutet dieser Befehl?

Ich bin auf eine Lösung eines Wettbewerbsproblems gestoßen, das die STL Map verwendet, mit einer anderen Art von Einfügung, die ich bereits kenne. Ich kenne diese Arten von Einfügungen (und ihre Unterschiede):

Map[key] = value; und Map.insert(make_pair(key,val));

Aber diese hier habe ich keine Ahnung, was sie macht, außer dass sie für das Problem funktioniert, das ich lösen muss:

   std::map freq;
   int inp;
   // ...

   for (int i = 0; i < n; i++)
    {
        scanf ("%d", &inp);
        freq [inp]++;
    }

    for (int i = 0; i < m; i++)
    {
        scanf ("%d", &inp);
        freq [inp]--;
    }

Wo freq eine Map mit einem Paar von ints ist und inp eine normale Ganzzahl ist.

4voto

Mark Ransom Punkte 283960

Wenn Sie den Suchoperator [] verwenden und der Schlüssel noch nicht im Mapping vorhanden ist, wird ein Eintrag erstellt, der mit einem Initialwert des Typs initialisiert ist. In diesem Fall wird ein Wert initialisiert int wird mit 0 initialisiert, wodurch ein Anfangswert von 0 entsteht. Der Operator ++ oder -- arbeitet dann mit diesem Wert.

2voto

Brian Cain Punkte 13956

Ich kenne diese Art von Einfügungen (und ihre Unterschiede):

Map[key] = value;

Map[key] ist nicht ausschließlich für Einfügungen bestimmt. Sie können diesem Wert auch einen Wert zuweisen. Die postincr/postdecr-Operatoren ändern diese Werte als Nebeneffekt.

Also ist Map[key]++ legal und tut, was man erwarten würde - erhöht den Wert, der unter Map[key] gespeichert ist. Äquivalent zu:

Map[key] = Map[key] + 1

0voto

lcjury Punkte 1085

Könnten Sie zeigen, wo Sie freq initialisiert haben? Wenn freq ein "Paar" von Ganzzahlen ist, müssen Sie darauf mit "freq[inp].first" und "freq[inp].second" zugreifen, und soweit ich weiß, sind "Paare" nicht mit dem + oder - Operator überladen.

for (int i = 0; i < n; i++)
{
    scanf ("%d", &inp);
    freq [inp]++;
}

hier speichert freq, wie oft eine Ganzzahl in der Eingabe gefunden wurde, wenn die Eingabe: 0, 0, 0, 1, 1 ist

map[0] = 3, und map[1] = 2

for (int i = 0; i < m; i++)
{
    scanf ("%d", &inp);
    freq [inp]--;
}

dasselbe, nur wird subtrahiert.

in diesem Fall können Sie nicht:

Map.insert(make_pair(key,val));

weil mit:

std::map freq;

sagen Sie, dass Ihre Map ein Integer als "Key" und einen Integer als "Value" haben wird, es ist kein "Map von Paaren", es ist einfach eine Map, es wäre eine Map von Paaren gewesen, hätten Sie es so initialisiert: std::map> freq;

Map[Schlüssel] = Wert;

wenn dies ein Wettbewerbsproblem ist, empfehle ich Ihnen einfach ein Array zu verwenden, setzen Sie die Größe auf das größte, das Sie benötigen werden, und initialisieren Sie es mit 0 wie erforderlich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X