C++ std::set的后\u插入器?

C++ std::set的后\u插入器?,c++,algorithm,stl,C++,Algorithm,Stl,我想这是一个简单的问题。我需要这样做: std::set<int> s1, s2; s1 = getAnExcitingSet(); std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ExcitingUnaryFunctor()); std::设置s1、s2; s1=getAnExcitingSet(); std::transform(s1.begin()、s1.end()、std::back_插入器(s2)、

我想这是一个简单的问题。我需要这样做:

std::set<int> s1, s2;
s1 = getAnExcitingSet();
std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ExcitingUnaryFunctor());
std::设置s1、s2;
s1=getAnExcitingSet();
std::transform(s1.begin()、s1.end()、std::back_插入器(s2)、ExcitingUnaryFunctor());
当然,
std::back\u inserter
不起作用,因为没有
push\u back
std::inserter
还需要迭代器吗?我没有使用std::inserter,所以我不知道该怎么办

有人有主意吗



当然,我的另一个选择是为
s2
使用向量,然后稍后对其进行排序。也许这样更好?

集合
没有
后推
,因为元素的位置由集合的比较器确定。使用
std::inserter
并传递它
。begin()

std::设置s1、s2;
s1=getAnExcitingSet();
转换(s1.begin(),s1.end(),
std::inserter(s2,s2.begin()),ExcitingUnaryFunctor();

然后,插入迭代器将调用
s2.insert(s2.begin(),x)
,其中
x
是写入迭代器时传递给迭代器的值。集合使用迭代器作为插入位置的提示。您也可以使用
s2.end()

在2016年,有人建议使用“单参数
插入器”
迭代器。 . 我不知道这项提议是否有效。我认为这是有道理的

现在,您可以使用以下行为定义maker函数:

template<class Container>
auto sinserter(Container& c){
    using std::end;
    return std::inserter(c, end(c));
}

既然
inserter(vec,vec.end())
也适用于向量,为什么会有人首先使用back\u inserter?@NHDaly:因为back\u inserter是faster@marton78但是,如果有的话,它不应该只以很小的幅度加快吗?当不需要移动任何元素时,在向量上调用
insert
而不是
push_back
应该大致相同(O(1))。@FelixDombek你是对的,不会慢很多
v.insert(x,v.end())
将在开头有一个额外的分支(因为它移动了n个元素,但这里n是零)。但是,使用
插入器
1)传达与使用
推回
2)不同的意图是不寻常的,会让读者停下来认为3)是过早的悲观。这是否适用于所有标准容器?它在std::forward\u list上不起作用(编译器错误是“forward\u list没有名为“insert”的成员,在
insert\u迭代器::operator=
的实例化内部)。是吗?@DonHatch,任何有
插入
(和
结束
)的内容。似乎
forward\u列表
一开始没有
insert
操作,只有
insert\u在
之后。我认为,即使这一点被改变了,它也不能在结束后插入。你不能用std::list来代替吗?当然,我个人不需要std::forward\u list。但我对一个通用的“如何将一个容器复制到另一个容器?”感兴趣,它适用于所有有意义的容器对。我目前的兴趣是使用通用容器分配器,比如@HowardHinnant的short_alloc.@DonHatch,问题是这个问题有很多变体。(“如何将一个容器复制到另一个?”)。例如,是否要保留原始值,是否要最小化分配,等等。对于最简单的情况,我认为最好的答案是使用构造函数,即使用两个迭代器的容器(大多数容器都可以使用该迭代器)。
NewContaner new\u container(old_other_container.begin(),old_other_container.end())
。是的,std::set不是顺序容器,这很好:-)
existing_list=std::list(c.begin(),c.end(),existing_list.get_allocator())
很好,我想这是我的答案。干杯!
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;});