如何用一行代码将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
相关产品推荐
相关产品推荐

