我以前用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]);
}
您可能会说“为什么不将代码写到1 for loop中”,但这仅是示例。
现在我正在尝试将上述代码重写为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];
}
这是问题。我该如何用索引i删除所有带索引i的变量,导致im出现数组下标的错误[Error]无效类型'int [int]'。
答案 0 :(得分:7)
您可能想要的是:
#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 << " ";
}
}
std::vector<int>
是一个旨在为可调整大小的数组提供接口的类。 push_back()
函数将向量附加给定参数。
最后一个循环,称为基于范围的for()
,用于打印向量的所有元素。您可以用带有索引的普通旧for()
循环替换它,因为std::vector
支持operator []
,但是如果基于范围的方法足够了,则应该首选。
编辑:我不了解JavaScript,但是(从您的示例中)我假设声明为 inside 循环的变量随处可见。 C++
中不是这种情况。变量的可见性取决于声明它们的范围。如果您希望 list / array / vector /任何其他容器对这两个for()
循环可见,则必须声明外部-就像上面的示例一样。
EDIT2:虽然您几乎总是应将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] << " ";
}
}
对于auto
,read here还是可以想象这只是(几乎总是)正确的魔术类型。就像Python或JavaScript中的var
(但稍后无法更改其类型)。
对于std::unique_ptr<T[]>
,可以使用read here,或者可以想象它只是一个动态分配的数组,可以自动delete[]
自身。如果您还没有了解动态分配,只需忽略它的含义,然后等到引入动态分配。
请注意,我们也摆脱了基于范围的for()
循环。不幸的是,它不适用于普通的,动态分配的数组。
答案 1 :(得分:1)
并非所有的编译器都支持VLA,因此请遵守标准。始终为数组指定恒定大小。如果需要动态更改大小,请考虑使用其他类型的容器,例如:std :: vector。
为什么还要在for循环中重新声明int w
?它是for循环的本地对象,对其进行更改不会影响外部循环。
您在第二个循环中收到一个编译时错误,抱怨w
不是数组。要解决此问题,请将int w[]
置于两个循环的外部和顶部。
int n, k;
cin >> n >> k;
int w[n];
for(int i = 0; i < n; i++)
cin >> w[i];
//some code here
for(int i = 0; i < n; i++)
cout << w[i];
替代VAL使用std :: vector:
std::vector<int> w;
int n, k;
std::cin >> n;
for(int i(0); i!= n; ++i){
std::cin >> k;
w.push_back(k);
}
for(auto i(0); i != w.length(); ++i)
std::cout << w[i] << ", ";