【问题标题】:A C++ Program which works fine in online compilers and linux operating systems, but not on Windows一个 C++ 程序,可以在在线编译器和 linux 操作系统中正常运行,但不能在 Windows 上运行
【发布时间】:2022-01-20 12:38:54
【问题描述】:

在编译问题时:
Geeks For Geeks: First Repeating Element 在 Windows 操作系统上我注意到我的解决方案没有得到任何输出。但是当我在 Linux 操作系统和在线编译器上编译相同的代码时,它运行得非常好,没有产生任何错误。

代码:

#include <bits/stdc++.h>
using namespace std;

int main() {

    int n;
    cin>>n;
    int arr[n];

    for(int i=0; i <n; i++) {
        cin>>arr[i];
    }

    int size= 1e6+1; // WA on windows
    int A[size];
    int min_index=INT_MAX;

    for(int i=0; i<size; i++) {
        A[i]=-1;
    }

    for(int i=0; i<n; i++) {
        if(A[arr[i]]!=-1)
            min_index=min(min_index, A[arr[i]]);
        else
            A[arr[i]]=i;
    }

    if(min_index==INT_MAX) 
        cout<<"-1";
    else
        cout<< min_index+1;

    return 0;
}

示例测试用例:

7
1 5 3 4 3 5 6

预期输出:

2

Windows 上的输出: Screenshot

Linux 上的输出: Screenshot

第 14 行代码的解释:

我创建了一个大小为1e6+1 的数组A 以在其arr[i]th 索引上存储值i
数组A 早先被初始化为值-1。它运行n 次数,变量min_index 存储数组arr 中重复次数最少的索引。
在初始化数组int size = 10 的较小值并使用非常小的测试用例后(arr[i] 的最大值也小于A 的大小;我意识到该程序在 Windows 中完美运行。

据我了解,Windows 在初始化如此大长度的数组时可能会遇到一些问题(如果我错了,请纠正我)。但是为什么在 Linux 的情况下不一样呢?

【问题讨论】:

  • 开始:Why should I not #include <bits/stdc++.h>? 继续:Why aren't variable-length arrays part of the C++ standard? 虽然using namespace std;a bad habit,但对于小而简单的示例通常被认为是可以的。
  • 最后:不要将所谓的“竞赛”或“在线评委”网站用作任何类型的教学或学习资源。它们不是,并且可能对您的正常学习有害。获取some good books 并参加课程以正确学习 C++(和一般编程)。
  • 考虑到您的 VLA(可变长度数组)A 有四百万字节大,我真的很惊讶该程序甚至可以在 Windows 上运行。 Windows 上的默认堆栈大小(和局部变量通常存储在堆栈中)只有一个 MiB。 1e+1 也是一个 浮点 值(double 类型)并且不比 1000001 更具可读性。
  • 或者问题在于 VLA A 真的太大而您的程序崩溃?这意味着您需要学习这些网站未教授的其他内容:调试
  • int A[size]; 否。以下是正确的 C++ 代码:std::vector&lt;int&gt; A(size);。其次,如前所述,使用 C++ 书籍来学习 C++。如果你这样做了,你就不会犯错,因为没有一本好的 C++ 书籍显示使用运行时变量声明数组。

标签: c++ linux windows memory


【解决方案1】:

#include &lt;bits/stdc++.h&gt; 不是标准 C++,因此您不应该期望它是可移植的。

int arr[n]; 不是标准 C++。一些编译器提供可变长度数组作为扩展,但它不是可移植的。 int A[size]; 也是如此。

遗憾的是,该站点上提供的大多数 C++ 代码都不是正确的 C++ 代码,而是一些方言。

有关详细信息,请参阅:Why should I not #include <bits/stdc++.h>?Why aren't variable-length arrays part of the C++ standard?。问答还应该解释标准的便携式替代品。

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 2020-10-27
    • 2019-03-12
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多