Думаю, это простой вопрос. Мне нужно сделать что-то вроде этого:
std::set<int> s1, s2;
s1 = getAnExcitingSet();
std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ExcitingUnaryFunctor());
Конечно, std::back_inserter
не работает, раз нет push_back
.
std::inserter
тоже нужен итератор? Я не использовал, std::inserter
поэтому не знаю, что делать.
Есть у кого-нибудь идеи?
Конечно, мой другой вариант - использовать вектор для
s2
, а потом просто отсортировать его. Может так лучше?
inserter(vec, vec.end())
работает и для векторов, зачем вообще кто-то использует back_inserter?insert
вместоpush_back
вектора должен быть примерно идентичным (O (1)), когда нет необходимости перемещать элементы.v.insert(x, v.end())
будет иметь дополнительную ветвь в начале (из-за перемещения n элементов, но здесь n равно нулю). Однако использованиеinserter
1) передает иное намерение, чем использованиеpush_back
2) необычно и заставляет читателя задуматься, 3) является преждевременной пессимизацией.В 2016 году было предложено создать «
inserter
итератор с одним аргументом ». https://isocpp.org/files/papers/p0471r0.html . Я не мог найти, было ли это предложение. Я думаю, это имеет смысл.На данный момент у вас может быть такое поведение, определяющее функцию производителя:
template<class Container> auto sinserter(Container& c){ using std::end; return std::inserter(c, end(c)); }
Используется в качестве:
std::transform(begin(my_vec), end(my_vec), sinserter(my_set), [](auto& e){return e.member;});
источник
insert_iterator::operator=
). Должен ли он?insert
(иend
). кажется, чтоforward_list
вообще нетinsert
операции, толькоinsert_after
. И даже если это изменить, я думаю, его нельзя вставить после конца. Разве вы не можете использоватьstd::list
вместо этого?NewContaner new_container(old_other_container.begin(), old_other_container.end())
.existing_list = std::list(c.begin(), c.end(), existing_list.get_allocator())
Очень хорошо, я думаю, это мой ответ. Ура!