532 Stimmen

Initialisierung einer statischen std::map<int, int> in C++

Wie kann man eine statische Karte richtig initialisieren? Brauchen wir eine statische Funktion, die sie initialisiert?

2voto

Hans Olsson Punkte 10194

Zusätzlich zu der guten Top-Antwort der Verwendung von

const std::map<int, int> m = {{1,1},{4,2},{9,3},{16,4},{32,9}}

gibt es eine zusätzliche Möglichkeit durch direkten Aufruf eines Lambdas, die in einigen Fällen nützlich sein kann:

const std::map<int, int> m = []()->auto {
  std::map<int, int> m;
  m[1]=1;
  m[4]=2;
  m[9]=3;
  m[16]=4;
  m[32]=9;
  return m;
}();

Es ist klar, dass eine einfache Initialisierungsliste besser ist, wenn man sie von Grund auf mit literalen Werten schreibt, aber sie eröffnet zusätzliche Möglichkeiten:

const std::map<int, int> m = []()->auto {
  std::map<int, int> m;
  for(int i=1;i<5;++i) m[i*i]=i;
  m[32]=9;
  return m;
}();

(Natürlich sollte es sich um eine normale Funktion handeln, wenn man sie wiederverwenden will; und das erfordert aktuelles C++).

-7voto

user2185945 Punkte 101

Sie haben hier einige sehr gute Antworten, aber für mich sieht es aus wie ein Fall von "wenn man nur einen Hammer kennt"...

Die einfachste Antwort auf die Frage, warum es keinen Standardweg zur Initialisierung einer statischen Map gibt, ist, dass es keinen guten Grund gibt, jemals eine statische Map zu verwenden...

Eine Karte ist eine Struktur, die zum schnellen Nachschlagen einer unbekannten Menge von Elementen dient. Wenn Sie die Elemente schon vorher kennen, verwenden Sie einfach ein C-Array. Geben Sie die Werte sortiert ein, oder lassen Sie sortieren, wenn Sie das nicht können. Sie können dann log(n)-Leistung erzielen, indem Sie die stl::-Funktionen verwenden, um Einträge in einer Schleife zu verarbeiten, lower_bound/upper_bound. Bei früheren Tests waren sie normalerweise mindestens viermal schneller als eine Karte.

Die Vorteile sind vielfältig... - schnellere Leistung (*4, ich habe bei vielen CPU-Typen gemessen, es ist immer um die 4) - einfachere Fehlersuche. Es ist einfach einfacher zu sehen, was in einem linearen Layout vor sich geht. - Triviale Implementierungen von Kopieroperationen, falls dies notwendig werden sollte. - Es wird zur Laufzeit kein Speicher zugewiesen, so dass nie eine Ausnahme ausgelöst wird. - Es handelt sich um eine Standardschnittstelle, so dass es sehr einfach ist, sie mit anderen DLLs, Sprachen usw. zu teilen.

Ich könnte noch mehr sagen, aber wenn Sie mehr wissen wollen, sollten Sie sich Stroustrups zahlreiche Blogs zu diesem Thema ansehen.

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