【问题标题】:Need of Dynamic Array in C++C++中对动态数组的需求
【发布时间】:2021-10-17 20:11:31
【问题描述】:

当我们在编译时不知道输入的确切大小时,我们会创建动态数组,对吗? 但是我们不能不使用动态数组来解决这个问题吗?例如:

cout<<"Enter Size of Array";
cin>>x;
int arr[x];

通过使用上面的代码,我们可以创建一个 int 数组,数组的大小取决于用户输入(即 x)。如果这段代码解决了我们的问题,那么动态数组需要什么?

我是编程新手,所以试着简单地解释一下。谢谢。

【问题讨论】:

  • 该代码不符合标准(并且不适用于例如:Visual Studio 的 C++ 编译器)
  • 这里的问题是 int arr[x];x 不是编译时间常数是 C++ 的非标准扩展。我建议避免这种情况,除非您确定所有编译器都希望编译支持此功能的代码(即便如此,这可能会使习惯于不支持此功能的不同编译器的其他人感到困惑)。
  • 最好将编译器配置为拒绝非标准 C++ 扩展,尤其是在学习时。 -std=c++20 -pedantic-errors 可以工作(如果您的编译器不支持c++20,则可以使用较低版本)。还可以使用 -Wall -Wextra 启用警告。
  • 它拥有普通原始数组的所有缺点——大小未知、衰减到ptr、传值,只需使用std::vector。 VLA 也是在堆栈上实现的 AFAIK(如 alloca),因此它们的大小非常有限。

标签: c++ arrays heap-memory


【解决方案1】:
  • 当数组大小事先未知或用户未输入时,使用动态数组。

例如,我们想要存储订阅产品更新的用户的详细信息。

在这种情况下,我们不知道有多少用户会订阅产品更新。所以我们需要动态数组,或者我们可以在 C++ 中使用vectors

通常在竞争性编码中,我们不需要动态数组,因为我们事先知道输入。但在现实世界的用例中,我们可能需要动态数组。

其他参考资料:

  • 矢量如何在内部工作 - link

【讨论】:

  • 这并不能回答为什么问题中提供的代码对于这种情况来说是不够的
  • 我认为问题是动态数组的需求是什么。给出的代码适用于大多数编译器。这个答案似乎解决了何时使用动态数组的问题。
  • 问题是:“如果动态数组解决的问题可以通过这段代码来解决[不使用 std::vector 或动态数组],那么动态数组的需求是什么”。重要的不是动态数组的使用,而是为什么不使用提供的代码
  • 所给出的代码只有在事先知道数组大小并且数组大小不变的情况下才能解决问题。
  • 我们可以使用我在问题中提供的代码作为动态数组的替代方案吗?如果不是那为什么?
【解决方案2】:

您可以使用 std::vector,它几乎可以用作数组。 并且它可以在运行时初始化,如果你想以后可以调整它的大小

std::cout<<"Enter Size of Array";
std::cin>>x;

//  vector also initializes all entries to 0
std::vector<int> values(x);
int answer = values[42];

【讨论】:

    猜你喜欢
    • 2011-08-29
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2017-12-01
    • 1970-01-01
    • 2017-03-11
    • 2010-10-10
    相关资源
    最近更新 更多