Ich muss kopieren std::set
nach std::vector
:
std::set <double> input;
input.insert(5);
input.insert(6);
std::vector <double> output;
std::copy(input.begin(), input.end(), output.begin()); //Error: Vector iterator not dereferencable
Wo ist das Problem?
assign()
Funktion:output.assign(input.begin(), input.end());
Antworten:
Sie müssen Folgendes verwenden
back_inserter
:std::copy
fügt dem Container, in den Sie einfügen, keine Elemente hinzu: es kann nicht; Es hat nur einen Iterator im Container. Wenn Sie einen Ausgabe-Iterator direkt an übergebenstd::copy
, müssen Sie daher sicherstellen, dass er auf einen Bereich verweist, der mindestens groß genug ist, um den Eingabebereich aufzunehmen.std::back_inserter
Erstellt einen Ausgabe-Iterator, derpush_back
für jedes Element einen Container aufruft , sodass jedes Element in den Container eingefügt wird. Alternativ könnten Sie eine ausreichende Anzahl von Elementen in erstellt habenstd::vector
, um den zu kopierenden Bereich aufzunehmen:Oder Sie können den
std::vector
Bereichskonstruktor verwenden:quelle
output.insert(output.end(), input.begin(), input.end());
stattdessen etwas tun ?output.insert(output.cend(), input.cbegin(), input.cend());
Was denkst du? Vielen Dank.input,size()
leeren Einträgen und hängen die Anhänge danach an. Ich denke du willst es benutzenstd::vector<double> output; output.reserve(input.size()); std::copy(...);
.Verwenden Sie einfach den Konstruktor für den Vektor, der Iteratoren benötigt:
Angenommen, Sie möchten nur den Inhalt von s in v und nichts in v, bevor Sie die Daten darauf kopieren.
quelle
Hier ist eine andere Alternative mit
vector::assign
:quelle
Sie haben nicht genügend Speicherplatz in Ihrem Vektorobjekt reserviert, um den Inhalt Ihres Sets aufzunehmen.
quelle
Ich denke, der effizienteste Weg besteht darin, Elemente vorab zuzuweisen und dann zu platzieren:
Auf diese Weise rufen wir nur den Kopierkonstruktor für jedes Element auf, anstatt zuerst den Standardkonstruktor aufzurufen und dann den Zuweisungsoperator für andere oben aufgeführte Lösungen zu kopieren. Weitere Erläuterungen weiter unten.
back_inserter kann verwendet werden, ruft jedoch push_back () für den Vektor auf ( https://en.cppreference.com/w/cpp/iterator/back_insert_iterator ). emplace_back () ist effizienter, da bei Verwendung von push_back () keine temporären Elemente erstellt werden . Dies ist bei trivial konstruierten Typen kein Problem, wird jedoch eine Leistungsimplikation für nicht trivial konstruierte Typen (z. B. std :: string) sein.
Wir müssen vermeiden, einen Vektor mit dem Größenargument zu konstruieren, wodurch alle Elemente standardmäßig konstruiert werden (für nichts). Wie zum Beispiel bei einer Lösung mit std :: copy () .
Und schließlich sind die Methode vector :: assign () oder der Konstruktor, der den Iteratorbereich verwendet, keine guten Optionen, da sie std :: distance () (um die Anzahl der Elemente zu kennen) für festgelegte Iteratoren aufrufen . Dies führt zu unerwünschten zusätzlichen Iterationen durch alle Set- Elemente, da es sich bei dem Set um eine Datenstruktur des binären Suchbaums handelt und keine Iteratoren mit wahlfreiem Zugriff implementiert werden.
Hoffentlich hilft das.
quelle
back_inserter
nicht verwendet werden mussstd::copy
kann nicht zum Einfügen in einen leeren Behälter verwendet werden. Dazu müssen Sie einen insert_iterator wie folgt verwenden:quelle