最直接的方式是用 for 循环遍历数组下标,判断元素是否小于0,若是则赋值为0;需通过下标访问确保左值可修改,兼容c++98及以上标准。

用 for 循环遍历并修改负数元素
最直接的方式是遍历数组,对每个元素判断是否小于 0,是则赋值为 0。适用于所有 C++ 标准(C++98 起就支持),兼容性最好,逻辑清晰不易出错。
注意:必须用 std::vector 或原生数组的下标访问,不能只读迭代器;修改操作要作用在左值上。
- 原生数组示例:
int arr[] = {-1, 2, -3, 0, 4, -5}; int n = sizeof(arr) / sizeof(arr[0]); for (int i = 0; i -
std::vector更安全写法:std::vector<int> v = {-1, 2, -3, 0, 4, -5}; for (int& x : v) { // 注意用 int& 而非 int,否则改的是副本 if (x </int> - 常见错误:写成
for (int x : v)→ 修改无效;或漏掉&导致静默失败
用 std::transform 配合 lambda 实现函数式写法
适合已有 std::vector 且倾向 STL 风格的场景。语义明确、无手动索引,但需注意目标容器和源容器是否为同一对象。
关键点在于:若想原地修改,第三个参数必须是 v.begin()(即输入输出迭代器相同),否则会复制到新位置。
- 原地修改示例:
std::vector<int> v = {-1, 2, -3, 0, 4, -5}; std::transform(v.begin(), v.end(), v.begin(), [](int x) { return x </int> - 不推荐写成
std::transform(..., std::back_inserter(new_v))——多分配内存,不符合“置为零”的原地意图 - 性能上与 for 循环基本一致,但编译器优化后可能略慢一两个指令周期(通常可忽略)
处理 const 数组或只读场景时的替代思路
如果原始数组是 const(比如全局常量表),无法直接修改,就得创建新容器承载结果。此时没有“置为零”的原地操作,只能映射生成。
- 用
std::array初始化新副本:constexpr std::array<int> src = {-1, 2, -3, 0, 4, -5}; std::array<int> dst; std::transform(src.begin(), src.end(), dst.begin(), [](int x) { return x </int></int> - 若用
const int arr[],先用std::span(C++20)或手动计算长度再拷贝,避免硬编码大小 - 误以为
const_cast可以绕过限制?不行——若原始内存真为只读(如文字段),运行时会触发 SIGSEGV
边界情况与类型陷阱
负数判定看似简单,但涉及类型时容易翻车。比如 unsigned int 数组根本不会有负数,char 可能因平台默认有符号性不同而行为不一致。
-
char数组需显式转为int判断:static_cast<int>(c) ,否则 <code>c 在 char 为 unsigned 的平台永远为 false -
float或double数组要用x ,别用 <code>== -0.0f——负零也是零,但-0.0f 为 false - 自定义数值类?确保重载了
operator 且语义符合数学中小于零的定义,否则 <code>if (x 可能调用隐式转换或编译失败
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











