使用std::signbit配合std::replace_if替换vector负数失败,求解决办法
解决std::replace_if结合std::signbit处理整数vector的报错问题
你猜的完全没错——std::signbit确实不支持整数类型!它是专门为浮点类型(float/double/long double)设计的函数模板,直接把它传给std::replace_if时,编译器没法确定要调用哪个重载版本,这就是你看到<unresolved overloaded function type>错误的原因。
给你一个一行代码的替代方案,用C++的lambda表达式直接实现判断逻辑,简单高效:
std::replace_if(myvector.begin(), myvector.end(), [](int x){ return x < 0; }, 0);
这个匿名函数会逐个检查vector里的int元素,只要是负值就会被替换成0,完全满足你的需求,而且不需要依赖<cmath>头文件里的浮点相关函数。
修正后的完整可运行代码如下:
// replace_if example #include <iostream> // std::cout #include <algorithm> // std::replace_if #include <vector> // std::vector int main () { std::vector<int> myvector; // set some values: for (int i=-10; i<10; i++) myvector.push_back(i); // 替换成lambda表达式的版本 std::replace_if (myvector.begin(), myvector.end(), [](int x){ return x < 0; }, 0); std::cout << "myvector contains:"; for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it) std::cout << ' ' << *it; std::cout << '\n'; return 0; }
运行这段代码后,vector里的所有负值都会被替换为0,输出结果会是:myvector contains: 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9
内容的提问来源于stack exchange,提问作者ares
相关产品推荐
相关产品推荐

