为 std: : set 设置的 back_insert?

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

std::set<int> s1, s2;
s1 = getAnExcitingSet();
std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ExcitingUnaryFunctor());

当然,std::back_inserter不工作,因为没有 push_backstd::inserter也需要迭代器吗? 我还没有使用 std::inserter,所以我不知道该怎么办。

有人知道吗?


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

40747 次浏览

set没有 push_back,因为元素的位置是由集合的比较器决定的。使用 std::inserter并把它传给 .begin():

std::set<int> s1, s2;
s1 = getAnExcitingSet();
transform(s1.begin(), s1.end(),
std::inserter(s2, s2.begin()), ExcitingUnaryFunctor());

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

2016年有人提议使用“单参数 inserter迭代器”。 https://isocpp.org/files/papers/p0471r0.html . I couldn't find if it the proposal advanced. I think it makes sense.

现在你可以用这个行为来定义 maker 函数:

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;});