【问题标题】:Is it more efficient to use array of pairs than using vector pair?使用对数组比使用向量对更有效吗?
【发布时间】:2020-06-27 19:53:36
【问题描述】:

当我使用 对向量 时,我得到了 TLE

vector<pair<int,int>> v;

for(int i=0;i<n;++i)
v.push_back(make_pair(a,b));

sort(v.begin(),v.end());

当我将代码更改为:

pair<int,int> v[n];
for(int i=0;i<n;++i)
{
       v[i].first=a;
       v[i].second=b;
}
sort(v,v+n);

我想了解这背后的逻辑。

【问题讨论】:

  • 在第一个示例中声明v 后,您是否尝试过添加v.reserve(n)?这将避免重新分配开销,使vector 大致相当于原始数组(如果您可以切换到emplace_back,则更等价。话虽如此,但不清楚为什么您不直接通过使用@ 初始化来填充东西987654327@ 单对的副本,因为值都相同。
  • 在第二个示例中,对数组的大小在编译时是已知的,并且将被放置在堆栈上,与您使用动态容器的第一个示例相比,这是(忽略任何小的向量优化)在堆上分配和重新分配。您总是可以尝试第一个示例,但调用 reserve 以在动态分配的向量中预先保留适当的大小,至少避免重新分配。
  • 这里的答案是正确的,但是很难想象当相同大小的数组适合堆栈时,任何向量效率低下都会导致 TLE。它太小了,不能成为一个真正的问题。您的代码中的其他地方可能存在更严重的问题。当您移动数组时,可能会产生不同的影响的缓冲区溢出。

标签: c++ algorithm time-complexity stdvector std-pair


【解决方案1】:

在这些行中

vector<pair<int,int>> v;

for(int i=0;i<n;++i)
   v.push_back(make_pair(a,b))

您创建了一个std::pair&lt;int,int&gt;向量,并在迭代n 次时尝试将元素放在它的末尾。在这些迭代过程中,v对向量)可能会经历多次重新分配,因为std::vector::capacity 不足以插入n 元素。这是一个昂贵的过程,因为需要将整个向量深度复制到适合新容量的新位置。因此,对于较大的n,您的程序会变慢,因为它需要多次重新分配。

解决方案是使用std::vector::researve 预先保留我们需要的内存(即在迭代和插入开始之前),这样可以避免昂贵的深度复制/重新分配。这意味着使用std::vector 解决方案执行以下操作也将成功解决时间限制问题。

#include <vector>
#include <utility>  // std::pair

std::vector<std::pair<int, int>> v;

const int n = 5; // lets say n = 5

v.reserve(n);   // now, reserve the memory for `n` pairs

for (int i = 0; i < n; ++i)
   // you can use `std::vector::emplace_back` to insert the pairs in place like this!
   v.emplace_back(a, b); 

作为旁注,请不要practice with using namespace std;

【讨论】:

    【解决方案2】:

    如果您在编译时知道对的计数并且此计数是恒定的,请使用 std::array。否则,您可以使用 std::vector 或其他 STL 容器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 2021-11-25
      • 1970-01-01
      • 2015-05-27
      • 2022-11-26
      • 2010-12-02
      • 1970-01-01
      相关资源
      最近更新 更多