【发布时间】:2020-10-22 17:44:11
【问题描述】:
自从我开始竞争性编程以来,我一直发现人们总是习惯于根据输入规范的最大值中的恒定最大值来初始化单个或二维数组。
但我一直想知道,当您可以根据输入初始化数组时,为什么人们会这样做。
例如,假设在接收数组(或向量)大小的输入时,问题的输入规格为 0 到 10 的 5 次方。
人们为什么这样做:
表示法:整数n代表输入,a代表数组:
#include<bits/stdc++.h>
using namespace std;
const int MXN = 1e5;
int a[MXN], n;
int main() {
cin >> n;
for(int i = 0; i<n; i++)
cin >> a[i];
}
而不是这个:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int a[n];
for(int i = 0; i<n; i++)
cin >> a[i];
}
或者这是最好的方法(这是我通常做的):
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int>a(n);
for(int i = 0; i<n; i++)
cin >> a[i];
//for(auto &i:a) cin >> i;
}
这样做有什么好处吗?谢谢。
【问题讨论】:
-
第一个sn-p是浪费内存或者越界访问,第二个sn-p不是标准的C++。两者都不应该使用,使用
std::vector。 (从技术上讲,它们都不是标准 C++,因为 this header)。 -
首先是因为您正在查看来自“竞争”网站的代码,人们不了解良好的编程实践,并使用许多坏习惯(包括您提出的那个)。 variable-length arrays 也不是标准 C++ 的一部分。
-
最后,请不要将竞赛网站用作学习或教学资源,或作为可供学习的优质代码的存储库,因为它们不是(我认为他们完全相反)。上课,阅读some good books,在使用此类网站之前正确学习。
-
这些技术的唯一“优势”(我用宽松的术语)是它们在竞争性编程网站上被接受。如果您想学习在现实世界中不好的编程技术,请继续使用这些方法,如果您希望获得一份像样的工作,作为一名程序员,从事您引以为豪的工作,那么您就必须放弃学习。跨度>
标签: c++ arrays initialization