在‘加一’算法问题中size_t与int的区别:为何该方案用size_t替代int会失效?
为什么用size_t替代int会导致“加一”代码失效?
问题背景
“加一”问题描述:给定一个以整数数组digits形式表示的非负大整数,数组中每个元素digits[i]对应该整数的第i位数字,数字从左到右按最高位到最低位排序,且无前导零。要求将该大整数加一,并返回结果数字数组。
原C++解决方案代码:
vector<int> plusOne(vector<int>& digits) { int n = digits.size(); for (int i = n - 1; i >= 0; i--){ if (digits[i] < 9){ digits[i]++; return digits; } else{ digits[i] = 0; } } digits.insert(digits.begin(), 1); return digits; }
问题:为何在上述解决方案的for循环中,使用size_t类型替代int类型会导致代码无法正常工作?
原因分析
- size_t是无符号整数类型:C++里
std::vector::size()返回的size_t属于无符号整数范畴,它的取值只能是非负数,不存在负数值。 - 循环终止条件彻底失效:如果把循环变量
i改成size_t类型,当i从n-1开始递减,直到i变为0后再执行i--,由于无符号数不能为负,此时i会触发溢出回绕,变成size_t类型能表示的最大值(比如64位系统下是18446744073709551615)。而i >= 0这个条件对无符号数来说永远成立,循环会无限执行,根本停不下来。 - 触发数组越界的未定义行为:当
i变成极大值后,访问digits[i]会直接超出数组的有效索引范围,程序可能崩溃、输出错误结果,或者出现其他不可预测的行为。
举个直观的例子:如果数组长度为1,i初始值是0,第一次循环执行完i--后,无符号的i会变成最大值,此时i >=0依然成立,循环继续,访问digits[i]就会越界。
内容的提问来源于stack exchange,提问作者Arvivald
相关产品推荐
相关产品推荐

