我以前用javascript编码,但我的新学校迫使我学习c ++.我是这种语言的新手,这就是问题所在:
在javascript中我可以编写这样的代码:
for(let i = 0; i < 10; i++){
var variable[i] = i+3;
}
for(let j = 0; j < 10; j++){
console.log(variable[j]);
}
Run Code Online (Sandbox Code Playgroud)
您可能会说'为什么不将代码写入1 for for循环',但这只是一个例子.
现在我正在尝试将上面的代码重写为cpp:
int n,k,w;
cin>>n>>k;
for(int i = 0; i < n; i++){
int w[i];
cin>>w[i];
}
//some code here
for(int i = 0; i < n; i++){
cout<<w[i];
}
Run Code Online (Sandbox Code Playgroud)
这就是问题所在.我怎么能用索引i cout所有变量w,导致我得到一个错误[错误]无效类型'int [int]'对于数组下标.
你可能想要的是:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec;
int size = 0;
std::cin >> size;
for(int i = 0; i < size; i++){
int number = 0;
std::cin >> number;
vec.push_back(number);
}
for(int i : vec){
std::cout << i << " ";
}
}
Run Code Online (Sandbox Code Playgroud)
std::vector<int>是一个旨在为可调整大小的数组提供接口的类.该push_back()函数使用给定的参数附加向量.
最后一个循环(称为基于范围的for()循环)用于打印向量的所有元素.您可以使用for()带有索引的普通旧循环替换它,因为std::vector支持operator [],但如果基于范围的方法足够,则应该首选.
编辑:我不知道的JavaScript,但我认为(从你的例子),该声明的变量内环路是随处可见.这是不是在的情况C++.变量的可见性取决于它们声明的范围.如果你希望list/array/vector /任何其他容器对这两个for()循环可见,你必须在它们之外声明- 就像我上面的例子.
编辑2:虽然你应该几乎总是std::vector用于这样的任务,但人们可能会争辩说他们想要禁用容器的大小调整.在这种情况下,我们只剩下简单的动态分配.我们到达<memory>图书馆,因为我们不应该自己管理它:
#include <iostream>
#include <memory>
int main() {
int size = 0;
std::cin >> size;
auto arr = std::make_unique<int[]>(size);
for(int i = 0; i < size; i++){
int number = 0;
std::cin >> number;
arr[i] = number;
}
for(int i = 0; i < size; i++){
std::cout << arr[i] << " ";
}
}
Run Code Online (Sandbox Code Playgroud)
因为auto,要么在这里阅读,要么想象它只是一种(几乎总是)正确的魔法类型.就像var在Python或JavaScript中一样(但后来其类型无法更改).
因为std::unique_ptr<T[]>,要么在这里阅读,要么想象它只是一个自动生成的动态分配数组delete[].如果您还没有了解动态分配,只需忽略它的含义并等到它被引入.
请注意,我们还摆脱了基于范围的for()循环.不幸的是,它不适用于普通的,动态分配的数组.