Saya rasa ini adalah pertanyaan sederhana. Saya perlu melakukan sesuatu seperti ini:
std::set<int> s1, s2;
s1 = getAnExcitingSet();
std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ExcitingUnaryFunctor());
Tentu saja, std::back_inserter
tidak berhasil karena tidak ada push_back
.
std::inserter
juga membutuhkan iterator? Saya belum pernah menggunakan std::inserter
jadi saya tidak yakin harus berbuat apa.
Apakah ada yang punya ide?
Tentu saja, pilihan saya yang lain adalah menggunakan vektor untuk
s2
, lalu menyortirnya nanti. Mungkin itu lebih baik?
inserter(vec, vec.end())
berfungsi untuk vektor, juga, mengapa ada orang yang menggunakan back_inserter?insert
alih-alihpush_back
pada vektor harus hampir sama (O (1)) ketika tidak ada elemen yang harus dipindahkan.v.insert(x, v.end())
akan memiliki cabang tambahan di awal (karena itu memindahkan n elemen, tetapi di sini n adalah nol). Namun, menggunakaninserter
1) mengkomunikasikan maksud yang berbeda dari menggunakanpush_back
2) tidak biasa dan membuat pembaca berhenti dan berpikir 3) adalah pesimisasi dini.Pada tahun 2016 ada usulan untuk memiliki "
inserter
iterator argumen tunggal ". https://isocpp.org/files/papers/p0471r0.html . Saya tidak dapat menemukan apakah proposalnya maju. Saya pikir itu masuk akal.Untuk saat ini Anda dapat memiliki perilaku ini yang mendefinisikan fungsi pembuat:
template<class Container> auto sinserter(Container& c){ using std::end; return std::inserter(c, end(c)); }
Digunakan sebagai:
std::transform(begin(my_vec), end(my_vec), sinserter(my_set), [](auto& e){return e.member;});
sumber
insert_iterator::operator=
). Haruskah itu?insert
(danend
). sepertinya ituforward_list
tidak memilikiinsert
operasi di tempat pertama, hanyainsert_after
. Dan bahkan jika yang diubah itu tidak dapat dimasukkan setelah akhir, saya pikir. Tidak bisakah Anda menggunakan sebagaistd::list
gantinya?NewContaner new_container(old_other_container.begin(), old_other_container.end())
.existing_list = std::list(c.begin(), c.end(), existing_list.get_allocator())
Sangat bagus, saya rasa itulah jawaban saya. Bersulang!