我可以在一行代码中将符合条件的向量的所有元素插入到集合中吗
Can I insert into a set, all the elements of a vector that matches a condition, in a single line of code
我有一个元素向量。我想使用该向量中符合特定条件的元素来填充一个集合。我可以用一行或比下面更简洁的任何方式来做到这一点吗?
// given vector<int> v
set<int> s;
for (const int& i : v)
{
if (/* some condition on i*/)
s.insert(i);
}
例如,类似以下内容:
// given vector<int> v
set<int> s;
s.insert(v.filter(/* lambda here*/));
不言而喻,出于性能原因,v.filter 方法应该 return 一个迭代器,而不是一个单独的填充向量。
您可以使用 std::copy_if
with a lambda and std::inserter
将值插入到集合中。看起来像
std::copy_if(v.begin(), v.end(), std::inserter(s, s.begin()), [](auto val) { return val == some_condition; });
如果是range-v3,那就是
set<int> s = v | ranges::view::filter([](int e){ return cond(e); });
或者干脆(如果 cond
已经存在)
set<int> s = v | ranges::view::filter(cond);
+1 对于 std::copy_if()
解决方案,恕我直言,这是该问题的自然解决方案。
只是为了好玩,我提出了一个基于std::for_each()
的不同解决方案
std::set<int> s;
std::for_each(v.cbegin(), v.cend(),
[&](int i) { if ( /* some condition */ ) s.insert(i); });
我有一个元素向量。我想使用该向量中符合特定条件的元素来填充一个集合。我可以用一行或比下面更简洁的任何方式来做到这一点吗?
// given vector<int> v
set<int> s;
for (const int& i : v)
{
if (/* some condition on i*/)
s.insert(i);
}
例如,类似以下内容:
// given vector<int> v
set<int> s;
s.insert(v.filter(/* lambda here*/));
不言而喻,出于性能原因,v.filter 方法应该 return 一个迭代器,而不是一个单独的填充向量。
您可以使用 std::copy_if
with a lambda and std::inserter
将值插入到集合中。看起来像
std::copy_if(v.begin(), v.end(), std::inserter(s, s.begin()), [](auto val) { return val == some_condition; });
如果是range-v3,那就是
set<int> s = v | ranges::view::filter([](int e){ return cond(e); });
或者干脆(如果 cond
已经存在)
set<int> s = v | ranges::view::filter(cond);
+1 对于 std::copy_if()
解决方案,恕我直言,这是该问题的自然解决方案。
只是为了好玩,我提出了一个基于std::for_each()
std::set<int> s;
std::for_each(v.cbegin(), v.cend(),
[&](int i) { if ( /* some condition */ ) s.insert(i); });