【问题标题】:std::vector vs std::array vs normal arraystd::vector vs std::array vs 普通数组
【发布时间】:2021-05-26 11:26:56
【问题描述】:

我举办在线编程比赛,程序的速度就是一切。随着时间的推移,我遇到了 3 种在 C++ 中使用数组概念的方法。比赛的问题通常要求我们创建一个给定大小的动态数组。所以它只是根据输入一次性创建动态数组,我们不会再次调整数组的大小。

std::vector

矢量看起来最花哨,每个人都喜欢它们。但是几天前,一个问题在使用向量时给了我 TIME_LIMIT_EXCEEDED 错误。
当我使用普通数组实现相同的逻辑时,程序已成功提交。
在研究中,我发现使用与普通的arr[i]=x; 相比,push_back() 函数需要很长时间


std::array

我对其性能了解不多。但它看起来是处理数组的更好方法。


C++ 中的默认数组

我使用int *arr=new int[given_size];进行动态分配,然后正常使用数组。
将数组作为参数传递不像向量那么简单,但也没什么大不了的。


除此之外,有时我还必须使用 2D 数组,而且我总是不确定什么是最快的方法。 vector<vector<int>> 在某些论坛中被认为很慢,使用多维指针也是如此。所以我喜欢使用带有 typedef 函数的一维数组来处理它的索引,但是当我必须将一行传递给函数时它会变得复杂。

论坛中的大多数答案都是基于 OP 试图做的事情,这给出了不同的答案。我想知道的是,使用哪种方法可以实现最高速度/效率的最佳且长期有效。

【问题讨论】:

  • 其实你可以尝试使用经典的全局C数组,其中大小的上限可以通过问题数据范围来推断。 std::vector 速度较慢,但​​在有时数组大小变化时非常易于使用。但是std::vector可以用像int arr[maxn]这样的全局数组来模拟。std::array在在线编程竞赛中几乎没有区别。新的动态数组被认为无用或无效。
  • 您将苹果与橙子进行比较。 Vector 是围绕可重定位存储的包装器。 arr[i]=x; 是向量的 operator[] 函数的模拟。 std::array 是一个包含静态大小数组的结构,通过赋值容易复制,并且可以从函数中返回(数组不能)。使用int *arr=new int[given_size];,您只需手动执行vector 的操作。
  • @Swift-FridayPie 感谢您的解释。那么使用向量的operator[] 可以达到与数组类似的性能吗?与传递指针相比,传递和返回向量是否会以任何方式影响性能?你也可以对使用二维数组有所了解。 vector<vector<int>> 是个好习惯吗?
  • good C++ book 开始比从无意义的编码比赛开始要好得多。
  • 基本不用讨论了。在线竞赛与严肃的软件开发无关。每个污垢都可以并且被放置在那里。那里没有任何东西可以用来学习 C++ 语言或良好的编码风格。您可能会学到的唯一事情是以快速而肮脏的方式实现算法。因此,您应该继续使用 VLA、拥有内存的原始指针、new 和宏以及所有这些严肃的 C++ 开发人员永远不会做的事情。所以,请尽情享受吧。严重地。唯一需要注意的是,如果你想成为一名专业的软件开发人员,那就不要这样做。

标签: c++ arrays vector


【解决方案1】:

push_back 比 arr[i]=x; 需要更长的时间。

抱歉,您在这里表明您缺乏向量经验,因为您的示例做了两件不同的事情。

您正在比较类似此代码的内容

vector<int> vec;       // vector created with size zero
for (...)
    vec.push_back(x);  // vector size increases

使用此代码

int arr[N];
for (...)
    arr[i] = x;

不同之处在于,在第一种情况下,向量的大小为 0,并且随着您向其中添加项目,它的大小会增加(这需要额外的时间),但在第二种情况下,数组以最终大小开始。对于数组,这是必须的,但是对于向量,您可以选择。如果你知道向量的最终大小是多少,你应该这样编码

vector<int> vec(N); // vector created at size N, note use () not []
for (...)
    vec[i] = x;

这是您应该与数组代码进行比较以提高效率的代码,

您可能还想研究向量的resizereserve 方法。向量(如果没有别的)比数组灵活得多。

【讨论】:

  • 对于我缺乏经验,我深表歉意。那么如果我们预先分配向量大小,它会提供相同的性能吗?你也可以对使用二维数组有所了解。 vector&lt;vector&lt;int&gt;&gt; 是一个好习惯吗?
  • @AbhinayPandey 它肯定会提供更好的性能,因为随着向量的大小增加,您不必不断重新分配向量。恐怕我对vector&lt;vector&lt;int&gt;&gt; 没有特别的了解,在我做的那种编码中,清晰度比速度更重要。
  • vector&lt;int&gt; vec(N); 将用 0 填充数组,因此还有一些工作要做(本网站上有关于避免这种初始化的问答)。
  • @AbhinayPandey vector&lt;vector&lt;int&gt;&gt;jagged matrix。这很简单,但根本不利于内存或性能。 What are the Issues with a vector-of-vectors?
猜你喜欢
  • 1970-01-01
  • 2016-06-15
  • 2014-12-15
  • 2012-04-18
  • 2015-01-15
  • 2017-09-21
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
相关资源
最近更新 更多