【发布时间】: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