Myślę, że to proste pytanie. Muszę zrobić coś takiego:
std::set<int> s1, s2;
s1 = getAnExcitingSet();
std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ExcitingUnaryFunctor());
Oczywiście std::back_inserter
nie działa, ponieważ nie ma push_back
.
std::inserter
również potrzebuje iteratora? Nie korzystałem, std::inserter
więc nie wiem, co robić.
Czy ktoś ma pomysł?
Oczywiście moją drugą opcją jest użycie wektora dla
s2
, a następnie posortowanie go później. Może tak jest lepiej?
inserter(vec, vec.end())
działa również dla wektorów, dlaczego ktoś w pierwszej kolejności używa back_inserter?insert
zamiastpush_back
na wektorze powinno być z grubsza identyczne (O (1)), gdy nie trzeba przesuwać żadnych elementów.v.insert(x, v.end())
będzie miał dodatkową gałąź na początku (dzięki temu przesuwa n elementów, ale tutaj n wynosi zero). Jednak użycieinserter
1) komunikuje inną intencję niż użyciepush_back
2) jest niezwykłe i sprawia, że czytelnik zatrzymuje się i myśli 3) jest przedwczesną pesymizacją.W 2016 r. Pojawiła się propozycja posiadania „
inserter
iteratora pojedynczego argumentu ”. https://isocpp.org/files/papers/p0471r0.html . Nie mogłem znaleźć, czy propozycja została wysunięta. Myślę, że to ma sens.Na razie możesz mieć takie zachowanie definiujące funkcję kreatora:
template<class Container> auto sinserter(Container& c){ using std::end; return std::inserter(c, end(c)); }
Użyty jako:
std::transform(begin(my_vec), end(my_vec), sinserter(my_set), [](auto& e){return e.member;});
źródło
insert_iterator::operator=
). Czy powinno?insert
(iend
). wydaje się, żeforward_list
nie mainsert
operacji w pierwszej kolejności, tylkoinsert_after
. A nawet jeśli to się zmieni, to chyba nie da się wstawić po zakończeniu. Nie możesz użyćstd::list
zamiast tego?NewContaner new_container(old_other_container.begin(), old_other_container.end())
.existing_list = std::list(c.begin(), c.end(), existing_list.get_allocator())
Bardzo fajnie, myślę, że to moja odpowiedź. Twoje zdrowie!