如何正确使用typedef定义的函数向量作为参数实现元素替换逻辑?
问题分析与代码修正
需求说明
需要编写一个函数:
- 第一个参数接收
std::vector<int>的引用 - 第二个参数接收一个谓词函数向量,每个函数接收int并返回bool
- 第三个参数是默认值为-1的替换值
- 逻辑:如果vector中的元素不满足所有谓词(即任意一个谓词返回false),就将该元素替换为指定默认值
原始代码
#include <iostream> #include <vector> #include <functional> typedef std::vector<std::function<bool(int)>> Functions; void default_if_not_all(std::vector<int>& i, Functions f,int def=-1){ for(auto& num : i){ for(auto& fun : f){ if(!(fun(num))){ num=def; } } } } int main(){ std::vector<int> v{1,2,3,4,5}; Functions f{ [&](int a){if( a>0 )return 1;}, [&](int a){if (a%2==0) return 1;} }; for(const auto& e : v){ std::cout<<e<<" "; } std::cout<<std::endl; }
问题点梳理
- 核心逻辑冗余:当前代码会遍历所有谓词,哪怕已经发现元素不满足条件并完成替换,这是无效操作。正确逻辑应该是:只要有一个谓词返回false,就替换元素并终止对当前元素的谓词检查。
- Lambda表达式不规范:
- 返回
1(int类型)不符合谓词的bool返回要求,应直接返回布尔表达式(如return a > 0;) - 不必要的捕获
[&]:lambda没有使用外部变量,改为[]更清晰高效
- 返回
- 未调用目标函数:main函数中没有调用
default_if_not_all,所以vector不会被修改 - 参数传递优化:函数向量
Functions f按值传递会导致拷贝,改为const引用const Functions& f更高效
修正后的代码
#include <iostream> #include <vector> #include <functional> // typedef的使用完全正确,清晰定义了函数向量类型 typedef std::vector<std::function<bool(int)>> Functions; void default_if_not_all(std::vector<int>& nums, const Functions& predicates, int def = -1) { for (auto& num : nums) { bool all_satisfied = true; // 遍历所有谓词,检查是否全部满足 for (const auto& pred : predicates) { if (!pred(num)) { all_satisfied = false; break; // 一旦不满足,立即终止检查 } } if (!all_satisfied) { num = def; } } } int main() { std::vector<int> v{1,2,3,4,5}; // 修正lambda:去掉不必要的捕获,直接返回布尔表达式 Functions f{ [](int a){ return a > 0; }, [](int a){ return a % 2 == 0; } }; std::cout << "修改前:"; for (const auto& e : v) { std::cout << e << " "; } std::cout << std::endl; // 调用目标函数,完成元素修改 default_if_not_all(v, f); std::cout << "修改后:"; for (const auto& e : v) { std::cout << e << " "; } std::cout << std::endl; }
代码说明
- Functions类型的使用:你定义的
typedef std::vector<std::function<bool(int)>> Functions是完全正确的,它将存储int到bool的函数对象的vector进行了别名封装,后续初始化函数向量Functions f{...}的写法也没问题,这个typedef很好地提升了代码可读性。 - 逻辑优化:新增
all_satisfied标记,一旦发现任意谓词不满足,立即跳出循环,避免无效遍历。 - Lambda修正:去掉不必要的捕获,直接返回布尔表达式,符合谓词的类型要求,代码更简洁。
- 参数优化:函数向量改为
const Functions&传递,避免拷贝开销。
内容的提问来源于stack exchange,提问作者Xavi
相关产品推荐
相关产品推荐

