用于std :: set的std :: back_inserter?

时间:2009-05-25 22:32:12

标签: c++ algorithm stl

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

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的向量,然后稍后对其进行排序。也许那更好?

2 个答案:

答案 0 :(得分:114)

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()

答案 1 :(得分:0)

2016年,有人提出了一个“单一参数inserter迭代器”的建议。 https://isocpp.org/files/papers/p0471r0.html。我找不到提案是否通过。我认为这是有道理的。

现在您可以通过以下行为定义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;});