【发布时间】: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++ 开发人员永远不会做的事情。所以,请尽情享受吧。严重地。唯一需要注意的是,如果你想成为一名专业的软件开发人员,那就不要这样做。