C++11中高效筛选结构体vector特定元素的方法咨询
C++11下结构体vector的筛选方案
在C++11环境中,你可以通过以下两种方式实现更简洁的筛选逻辑,同时需要注意效率上的取舍:
1. 使用std::copy_if实现单条件筛选
<algorithm>中的std::copy_if可以实现单条件的元素筛选,代码可读性更强,但要注意:原for循环是一次遍历处理三个筛选条件,而多次调用std::copy_if会遍历vector三次,效率略低。适合优先追求代码整洁的场景。
示例代码:
#include <vector> #include <algorithm> // 需包含此头文件 struct S { int a=0; int b=0; int c=0; }; int main() { std::vector<S> v; v.push_back(S{1,2,3}); v.push_back(S{1,3,2}); v.push_back(S{2,2,3}); v.push_back(S{3,3,2}); std::vector<S> a1,b2,c3; // 筛选a==1的元素到a1 std::copy_if(v.begin(), v.end(), std::back_inserter(a1), [](const S& s){ return s.a == 1; }); // 筛选b==2的元素到b2 std::copy_if(v.begin(), v.end(), std::back_inserter(b2), [](const S& s){ return s.b == 2; }); // 筛选c==3的元素到c3 std::copy_if(v.begin(), v.end(), std::back_inserter(c3), [](const S& s){ return s.c == 3; }); }
2. 封装自定义pick函数实现类pick(v, S.a==1)的简洁调用
如果想要更接近你期望的pick语法,可以封装一个通用模板函数,结合lambda表达式实现:
#include <vector> #include <algorithm> struct S { int a=0; int b=0; int c=0; }; // 自定义pick函数模板 template<typename T, typename Predicate> std::vector<T> pick(const std::vector<T>& source, Predicate pred) { std::vector<T> result; std::copy_if(source.begin(), source.end(), std::back_inserter(result), pred); return result; } int main() { std::vector<S> v; v.push_back(S{1,2,3}); v.push_back(S{1,3,2}); v.push_back(S{2,2,3}); v.push_back(S{3,3,2}); // 用自定义pick函数筛选 auto a1 = pick(v, [](const S& s){ return s.a == 1; }); auto b2 = pick(v, [](const S& s){ return s.b == 2; }); auto c3 = pick(v, [](const S& s){ return s.c == 3; }); }
关于效率的关键说明
如果你追求极致效率,原有的for循环是最优选择——它只遍历一次vector就完成三个筛选条件的判断,避免了多次遍历带来的开销。而上面两种简洁写法本质是多次遍历,适合代码可读性优先的场景。
内容的提问来源于stack exchange,提问作者furynerd
相关产品推荐
相关产品推荐

