我想这是一个简单的问题。我需要做这样的事情:
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
的向量,然后稍后对其进行排序。也许那更好?
答案 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;});