【问题标题】:Problems with for loop c++for循环c ++的问题
【发布时间】:2018-09-15 10:57:06
【问题描述】:

我以前用 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 循环”,但这只是示例。

现在我正在尝试将上面的代码重写为 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 的所有变量 w,导致我收到错误 [Error] invalid types 'int[int]' for array subscript.

【问题讨论】:

  • int w[i]; 不是有效的标准 C++(一些编译器支持它作为扩展)。另外,为什么不直接在 for 循环之外声明数组?
  • 为了可读性,避免 for (int i =.... 在函数顶部声明 i: int i; then for (i = ....
  • @peakpeak 这与可读性完全相反,这就是为什么C(默认为C++)后来摆脱了强制在函数顶部声明的变量声明限制。
  • Fureeish:没错。保持模糊。没有线索!

标签: c++ for-loop


【解决方案1】:

你可能想要的是:

#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&lt;int&gt; 是一个类,旨在为可调整大小的数组提供接口。 push_back() 函数将向量附加到给定的参数。

最后一个循环,称为基于范围的for(),用于打印向量的所有元素。您可以用带有索引的普通旧 for() 循环替换它,因为 std::vector 支持 operator [],但如果基于范围的方法就足够了,那么它应该是首选。

编辑:我不了解 JavaScript,但我假设(根据您的示例)声明 inside 循环的变量随处可见。 C++ 不是这种情况。变量的可见性取决于它们声明的范围。如果您希望 list/array/vector/任何其他容器 对这两个 for() 循环可见,则必须声明它 在他们之外——就像我上面的例子一样。

EDIT2:虽然您几乎应该总是使用std::vector 来执行此类任务,但有人可能会争辩说他们想要禁用调整容器大小。在这种情况下,我们只剩下简单的动态分配。我们访问&lt;memory&gt; 库,因为我们不应该自己管理它:

#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&lt;T[]&gt;,要么是read here,要么想象它只是一个自动分配给delete[]s 本身的动态分配数组。如果您还没有了解动态分配,请忽略它的含义并等到它被引入。

请注意,我们还删除了 基于范围的for() 循环。不幸的是,它不适用于普通的、动态分配的数组。

【讨论】:

    【解决方案2】:

    并非所有编译器都支持 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] << ", ";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-22
      • 2011-07-04
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      相关资源
      最近更新 更多