最直接方式是用for循环遍历数组,以>0和

用 for 循环遍历数组并判断符号
最直接的方式是遍历每个元素,用 > 0 判断正数、 判断负数(注意:0 既不是正也不是负)。适用于所有 C++ 标准,无需额外头文件。
常见错误是把 0 错误计入正数或负数;还有人写成 >= 0,导致 0 被统计进正数计数器。
实操建议:
- 初始化两个整型变量:
int positive = 0, negative = 0; - 循环中严格用
arr[i] > 0和arr[i] ,跳过 <code>== 0的情况 - 如果数组是
std::vector<int></int>,优先用范围 for:for (int x : vec) { if (x > 0) positive++; else if (x
用 std::count_if 配合 lambda(C++11 起)
更函数式、可读性高,适合已有容器且不关心性能微差的场景。需要包含 <algorithm></algorithm> 和 <iterator></iterator>(后者在部分标准库中对数组需显式传 std::begin/std::end)。
容易踩的坑:对原生数组忘记传迭代器范围,直接传数组名会退化为指针,std::count_if 无法推导长度。
实操建议:
- 对
int arr[10],写法是:std::count_if(std::begin(arr), std::end(arr), [](int x) { return x > 0; }); - 对
std::vector<int> v</int>,可直接:std::count_if(v.begin(), v.end(), [](int x) { return x - 别在 lambda 里写
x >= 0——这统计的是“非负”,不是“正数”
处理浮点数数组时要注意精度问题
如果数组类型是 float 或 double,直接用 > 0.0 判断看似没问题,但受浮点误差影响,本该是 0 的计算结果可能变成极小正数(如 1e-17),被误判为正数。
这不是 C++ 特有,而是 IEEE 754 浮点表示的共性问题。实际项目中若涉及科学计算或传感器数据,必须考虑容差。
实操建议:
- 定义容差常量:
const double eps = 1e-9; - 正数判断改用:
x > eps,负数判断用:x - 绝对值小于
eps的数统一视为 0,不计入任一计数器
性能差异和编译器优化提示
纯循环和 std::count_if 在开启 -O2 后生成的汇编通常几乎一致,现代编译器能很好内联 lambda 和展开简单循环。但手动循环在调试时更容易打断点、观察中间状态。
真正影响性能的是访问模式:连续内存(如栈数组、std::vector)下两者都快;若数组是稀疏结构或自定义迭代器(如 strided view),std::count_if 可能更清晰表达意图,但需确认迭代器开销。
实操建议:
- 日常开发优先选易读、易维护的写法,别过早优化
- 嵌入式或实时系统中,若数组极大且循环体极简,可加
[[likely]]提示分支预测(C++20):if (x > 0) [[likely]] { positive++; } - 避免在循环内做 I/O、动态内存分配等重操作——那才是真正的瓶颈
边界情况比想象中多:比如全零数组、含 NaN 的浮点数组、char 类型隐式提升为 int 后的符号扩展(char c = -1; 在 int 比较中仍是负数,但若用 unsigned char 就不是了)。动手前先明确数据类型和业务语义。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











