gpt4 book ai didi

c++ - 为什么我们将单维或多维数组的大小声明为常量值?

转载 作者:行者123 更新时间:2023-12-01 14:47:26 24 4
gpt4 key购买 nike

自从我开始竞争性编程以来,我一直发现人们总是习惯于根据输入规范的最大值的恒定最大值来初始化单维或二维数组。
但是我一直想知道当您可以根据输入初始化数组时,为什么人们会这样做。
例如,假设在接收数组(或 vector )大小的输入时,问题的输入规范为 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;
}
这样做有什么好处吗?谢谢你。

最佳答案

这3种方法各有优缺点。选择取决于目标。
第一种方法:静态存储持续时间数组

  • 该数组在程序执行期间持续,
  • 内存分配在程序启动时执行(可能由操作系统执行),而且非常便宜
  • 它不提供值语义。 (它不能轻易复制、移动或分配)。

  • 这种方法可能对小项目的执行速度有好处,但它不具有可扩展性。
    方法二:栈上分配的数组
  • 数组生命周期从它的定义开始,到块作用域退出
  • 结束。
  • 内存分配是在程序执行期间执行的,并且只包含非常便宜的汇编指令。
  • 它不提供值语义。 (它不能轻易复制、移动或分配)。
  • 它是标准语言的编译器扩展。

  • 这种方法对于临时缓冲区来说是一个不错的选择,但它又是不可扩展的,众所周知它是导致堆栈溢出的原因。
    第三种方法:动态分配数组,std::vector
  • 阵列生命周期在需要时开始和结束,
  • 内存分配在程序执行过程中进行,成本相对较高
  • 它确实提供了值语义。 (它可以很容易地复制、移动或分配)。

  • 这应该是默认选择。

    关于c++ - 为什么我们将单维或多维数组的大小声明为常量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62691028/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com