Ich habe eine Template-Klasse mit einem std::vector
der Vorlage Argument. Das Argument darf nicht standardmäßig konstruierbar sein. Ich möchte reduzieren die Größe des Vektors (schneiden Sie es auf eine bestimmte Größe). OffensichtlichReduzieren der Größe eines std :: vector ohne einen Standardkonstruktor
vec.resize(reduced_size);
... funktioniert nicht, da es einen Standardkonstruktor erfordert.
Ich könnte natürlich:
- den Standardkonstruktor für jeden verwendeten Typen erstellen (die mich erfordert es hinzufügen, wenn es nicht eine gute Design-Wahl sein könnte)
- übergeben Sie einen Standardwert für die Funktion (nutzlos Unordnung der Schnittstelle)
- ein Bauverfahren zum Template übergeben (auch nutzlos Unordnung)
Während die Frage schrieb, bemerkte ich, dass ich kann erase
die Elemente aus dem Vektor bis zum Ende:
vec.erase (vec.begin() + position, vec.end());
... aber ich bin nicht sicher, ob dies als resize
so effizient sein wird.
Gibt es eine effiziente Möglichkeit, die Größe eines Vektors ohne einen Standardkonstruktor zu reduzieren?
C++ 11 Lösungen sind akzeptabel.
EDIT: Es scheint, dass sowohl MSVC und GCC implementieren als Lösch Anruf schrumpfen die Größe, so dass meine Leistung Frage beantwortet.
Ich sehe nicht, warum Löschen weniger effizient sein sollte. Es speichert 0 Bytes und ist ansonsten identisch. Haben Sie ein Benchmarking durchgeführt? – Dave
http://stackoverflow.com/questions/4820998/resizing-an-stdvector-which-elements-are-beeinträchtigte –
Ich bin immer noch ein C++ Anfänger, aber ich verstehe nicht, warum 'T' einen Standardkonstruktor benötigen würde wenn sie schrumpft. –