Ich ging durch Josuttis "Verwendung von Karten als assoziative Arrays" (von The C++ Standard Library - A Tutorial and Reference, 2nd Edition) und stieß auf Using a std::map as an associative array auf Stack Overflow. Jetzt habe ich mehr Fragen zu den Konstruktoren, die beim Einfügen in eine Map aufgerufen werden.Brauchen Sie Hilfe zu verstehen mit C++ Map als assoziative Array
Hier ist mein Beispielprogramm (nicht am besten Praktiken Codierung verwendet; mich bitte entschuldigen, dass):
class C
{
public:
string s;
C() { cout << "default " << endl;}
C(const string& p) : s(p)
{ cout << "one param" << endl;}
C(const C& obj)
{
if (this != &obj)
{
s = obj.s;
}
cout << "copy constr" << endl;
}
C& operator = (const C& obj)
{
if (this != &obj)
{
s = obj.s;
}
cout << "copy initializer" << endl;
return *this;
}
};
int main()
{
map<int,C> map1;
C obj("test");
cout << "Inserting using index" << endl;
map1[1] = obj;
cout << "Inserting using insert/pair" << endl;
map1.insert(make_pair(2,obj));
}
Die Ausgabe für dieses Programm ist:
one param
Inserting using index
default
copy constr
copy constr
copy initializer
Inserting using insert/pair
copy constr
copy constr
copy constr
copy constr
Ich war die Annahme, dass die Initialisierung map by index sollte den Standardkonstruktor und anschließend den Zuweisungsoperator aufrufen.
Aber Ausführung map1[1] = obj
erstellt folgenden Ausgang;
Inserting using index
default
copy constr
copy constr
copy initializer
Kann mir jemand helfen, die Initialisierung besser zu verstehen?
Sie legen nicht für die Kopie Konstruktion selbst testen müssen. –
In der Tat, jetzt verstehe ich, dass es besser ist, Zeiger als Objekte in STL-Containern zu haben. – mithuna
@mithuna: Warnung: Das Speichern von Zeigern anstelle von Objekten bringt lebenslange Probleme mit der Verwaltung mit sich, daher würde ich sagen, dass es besser ist, Objekte zu speichern. * Wenn * dies Leistungsprobleme verursacht, sollten Sie sehen, ob die Kopie optimiert werden kann. Dann, wenn es nicht möglich ist, könnten Sie in Erwägung ziehen, Zeiger anstelle von Objekten zu speichern. In diesem Fall könnten Sie an der Boost.PointerContainer-Bibliothek interessiert sein (http://www.boost.org/doc/libs/1_40_0/libs/ptr_container/doc/ptr_container.html). ptr_map (http://www.boost.org/doc/libs/1_40_0/libs/ptr_container/doc/ptr_map.html), im vorliegenden Fall. –