vector::resize增加了多少容量?
By how much does vector::resize increase capacity?
据我所知,c++标准并没有明确规定当vector::resize需要增加时如何增加vector::resize。但是有"典型的"实现吗?
具体来说:我不知道我的向量需要多大。此外,元素的顺序是随机的。因此,对于每个元素,我都写上:
if ( index >= vector.size() ) {
vector.resize ( index + 1 );
}
vector.at ( index ) = element;
如果元素以索引递增的顺序出现,每次调用resize时,vector的容量会增加1吗(在典型的实现中)?
该标准不保证对resize()
的重复调用的渐近性。容器简单地将容量增长到所需的目标尺寸是完全可行的。事实上,在resize()
的大多数标准用例中,这可能是理想的行为(即最少的浪费)(例如,它只使用一次)。
如果你担心,就实现你自己的几何增长:
if (index + 1 > v.size()
{
if (v.capacity() < index + 1)
{
v.reserve(2 * (index + 1)); // I had 2 * capacity() here first, but
// I think this version is better
}
v.resize(index + 1);
}
正如您所提到的,resize
的作用完全取决于您的实现(并且可能在同一实现的不同版本之间发生变化)。
在兼容的实现中,push_back
导致容量每次增加一倍,这与一系列push_back
的平摊复杂度有关。如果每次增加1的容量,N
添加的复杂度将是O(N^2)
,而如果push_back
每次增加一倍的容量,相同的一系列添加的复杂度将只有O(N)
-这是一个大问题。
至于你的问题-如果你提前知道最大的index
,只需预先分配。否则,我认为你最好使用std::map
:
map<int, T> M;
for (...) {
M[index] = element;
}
对于N
的添加,这将具有O(N log N)
的复杂度,但不会在没有相应element
的索引上浪费内存。
相关文章:
- 复制列表初始化的隐式转换的等级是多少
- while循环中while循环的时间复杂度是多少
- 如何检查一个c++字符串中有多少相同的字符/数字
- C++有多少类型的循环
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 具有非整数边容量的最大流量的Dinic算法
- 将stl字符串缩小到小于15个字符的容量
- 在条件变量中触发错误信号的频率是多少
- 函数的时间复杂度是多少?
- 在容量内调整矢量大小时的性能影响
- 必须为 C++20 协程帧保留多少内存?
- 对于四轴飞行器,PID中I控制器的理想值应该是多少
- C++,数组有多少个地址?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 在 Linux 中存储区域设置名称的缓冲区大小应该是多少?
- 在内存不足之前,我可以声明多少个 const 变量?
- 可以读入进程内存的最大块大小是多少?
- 如何在不知道C++中有多少可选参数的情况下在循环中使用va_arg?
- 在二维向量或数组中可以存储的最大元素数是多少?
- vector::resize增加了多少容量?