C++使用范围for循环给vector赋值输出仅返回0的问题如何解决
问题技术原因
- 你对范围for循环的作用逻辑理解完全错误:C++的范围for遍历容器时,每次迭代拿到的是容器内存储的元素值,而非容器下标。
- 你初始化
std::vector <int> square(lenght)时,长度为lenght的vector所有元素会被默认初始化为0,因此第一个范围for每次拿到的counter值都是0,全程仅修改square[0]为0,其余元素始终保持初始的0值。 - 第二个输出用的范围for同样每次拿到的
counter都是0,因此只会重复输出square[0]的0值。 - 额外的代码问题:参数名
lenght拼写错误、函数声明为int返回值但无return语句、混用printf和cout两种输出方式属于没必要的冗余写法。
修复建议
方案1:直接用普通for循环处理下标逻辑
你原本的需求是按下标0到lenght-1计算平方,直接用普通for循环就完全符合需求:
#include <vector> #include <iostream> void Square(int length) // 不需要返回值的话可以改成void { std::vector<int> square(length); for(int counter = 0; counter < length; counter++) { square[counter] = counter * counter; } for(int val : square) { // 范围for直接拿元素值输出即可 std::cout << val << std::endl; } }
方案2:坚持用范围for的预处理方案
如果一定要用范围for实现,需要先把vector填充为0到length-1的递增序列,再遍历元素计算平方:
#include <vector> #include <iostream> #include <numeric> // 包含std::iota void Square(int length) { std::vector<int> square(length); std::iota(square.begin(), square.end(), 0); // 填充0、1、2...length-1 for(int& counter : square) { // 用引用才能修改容器内的元素值 counter = counter * counter; } for(int val : square) { std::cout << val << std::endl; } }
- 范围for仅适合遍历容器元素的场景,需要处理下标逻辑时不要强行用范围for,普通for循环是更合适的选择。
- 用范围for修改容器元素时,需要把循环变量声明为引用类型(
int&),否则修改的只是元素的临时拷贝,不会生效。
内容的提问来源于stack exchange,提问作者01d
相关产品推荐
相关产品推荐

