for循环c ++的问题

时间:2018-09-15 10:57:07

标签: c++ for-loop

我以前用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]'。

2 个答案:

答案 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] << " ";
    }
}

对于autoread 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] << ", ";