You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用一行代码将vector中符合条件的元素插入set?

更简洁的vector到set过滤方案

当然可以!C++标准库提供了几种比手动for循环更简洁的方式来实现这个需求,甚至能做到接近一行代码的程度,下面给你详细拆解:

方案一:用std::copy_if + 插入迭代器(C++11及以上)

这是兼容性比较好的写法,不需要依赖最新标准,用标准库算法替代手动循环:

#include <algorithm>
#include <iterator>
#include <vector>
#include <set>

int main() {
    std::vector<int> v = {1, 3, 5, 7, 9, 2, 4};
    std::set<int> s;
    
    // 把v中大于5的元素插入s,条件可按需修改
    std::copy_if(v.begin(), v.end(), std::inserter(s, s.end()), 
                 [](int i) { return i > 5; });
    return 0;
}

std::copy_if会遍历vector的元素,对每个元素执行lambda里的条件判断,符合条件的元素会通过std::inserter插入到set中,完全替代了手动的循环和if判断,代码更紧凑也更符合STL的风格。

方案二:C++20 Ranges(一行代码实现!)

如果你能使用C++20或更高版本,Ranges库可以让写法变得非常接近你构想的v.filter()形式,真正做到一行代码:

#include <ranges>
#include <vector>
#include <set>

int main() {
    std::vector<int> v = {1, 3, 5, 7, 9, 2, 4};
    
    // 直接通过管道过滤并转换为set
    auto s = v | std::views::filter([](int i) { return i > 5; }) 
               | std::ranges::to<std::set<int>>();
    return 0;
}

这里用了C++20的视图(views)和管道运算符,先对vector做过滤,再直接把过滤后的元素转换成set,写法直观又简洁,完全符合你想要的“一行代码”需求。

小提示

  • 如果你的项目还在使用C11之前的版本,那手动循环确实是最直接的选择;但现在绝大多数项目都已经支持C11及以上,优先考虑上面的标准库方案。
  • lambda表达式里的条件可以根据你的需求自由修改,比如判断元素是否为偶数、是否在某个范围内等等。

内容的提问来源于stack exchange,提问作者nappyfalcon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:40:17