Ich denke, das ist eine einfache Frage. Ich muss so etwas tun:
std::set<int> s1, s2;
s1 = getAnExcitingSet();
std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ExcitingUnaryFunctor());
Funktioniert natürlich std::back_inserter
nicht, da es keine gibt push_back
.
std::inserter
braucht auch einen Iterator? Ich habe es nicht benutzt std::inserter
und bin mir nicht sicher, was ich tun soll.
Hat jemand eine Idee?
Natürlich besteht meine andere Option darin, einen Vektor für zu verwenden
s2
und ihn später zu sortieren. Vielleicht ist das besser?
inserter(vec, vec.end())
Warum verwendet jemand back_inserter überhaupt, da er auch für Vektoren funktioniert?insert
anstellepush_back
eines Vektors sollte ungefähr identisch sein (O (1)), wenn keine Elemente verschoben werden müssen.v.insert(x, v.end())
wird am Anfang einen zusätzlichen Zweig haben (weil es n Elemente bewegt, aber hier ist n Null). Die Verwendung voninserter
1) kommuniziert jedoch eine andere Absicht als die Verwendung vonpush_back
2) ist ungewöhnlich und lässt den Leser innehalten und denken, 3) sei eine vorzeitige Pessimisierung.2016 gab es einen Vorschlag für einen "
inserter
Iterator mit nur einem Argument ". https://isocpp.org/files/papers/p0471r0.html . Ich konnte nicht feststellen, ob der Vorschlag fortgeschritten war. Ich denke es macht Sinn.Im Moment kann dieses Verhalten die Maker-Funktion definieren:
Benutzt als:
quelle
insert_iterator::operator=
). Sollte es?insert
(undend
). es scheint, dass esforward_list
überhaupt keineinsert
Operation gibtinsert_after
. Und selbst wenn das geändert wird, kann es nach dem Ende nicht eingefügt werden, denke ich. Kannst du nichtstd::list
stattdessen ein verwenden?NewContaner new_container(old_other_container.begin(), old_other_container.end())
.existing_list = std::list(c.begin(), c.end(), existing_list.get_allocator())
Sehr schön, ich denke, das ist meine Antwort. Prost!