c++ - 使用对数组比使用向量对更有效吗?
问题描述
当我使用一对向量时,我得到了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);
我想了解这背后的逻辑。
解决方案
在这些行中
vector<pair<int,int>> v;
for(int i=0;i<n;++i)
v.push_back(make_pair(a,b))
您创建 的向量std::pair<int,int>
n
,并在迭代次数时尝试将元素放在它的末尾。在这些迭代过程中,v
( vector of pairs ) 可能会经历多次重新分配,因为这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);
作为旁注,请不要练习using namespace std;
推荐阅读
- swift - 使用 UIColelctionViewCompositionalLayout 时 UICollectionView 中的标题部分未附加到屏幕顶部
- python - 如何在 pythonanywhere 中安排脚本?
- xamarin - Xamarin.Firebase.Crashlytics 导致 AAPT2 生成错误
- resources - 资源冲突和 AppScript 创建的 Google 日历事件
- ssl - 如何在 WireMock 中实现一种方式的 SSL?
- visual-studio-code - Visual Studio 代码中的 pylintrc 配置
- cakephp - 将 jQuery 值传递给 jQuery 中的 PHP 值
- opencv - 未知内在和外在参数内的 OpenCV 相机校准:组合算法 DLT 和 SolvePNP
- c# - 如何处理实体框架模型而不丢失生产部署中的先前数据?
- sql-server - 从 SQL Server 到 MongoDB Atlas 的 ETL 管道