将vector::resize()的大小调整为较低计数时重新分配的空间
Space reallocated in vector::resize() when resized to lower count?
根据Stroustrup:C++编程语言:-
"当向量被调整大小以容纳更多(或更少)元素时,其所有元素可能移动到新位置。">
即使向量被重新调整为更小的大小,这是否成立?
情况1:如果请求的新大小大于当前std::vector::capacity()
,则将重新定位所有元素
情况2:如果请求的新大小小于当前std::vector::capacity()
,则不会重新定位元素。
标准证据:
本标准将vector::resize()
的作用定义为:
C++11标准23.3.6.3/12矢量容量:
void resize(size_type sz, const T& c);
效果:
if (sz > size())
insert(end(), sz-size(), c);
else if (sz < size())
erase(begin()+sz, end());
else
; // do nothing
正如@DavidRodríguez dribeas正确指出的,std::vector::insert()
操作的迭代器无效规则是:
23.3.6.5矢量修饰符
1[插入,推送_返回,模板,模板_返回]
备注:如果新大小大于旧容量,则导致重新分配。如果没有重新分配,则插入点之前的所有迭代器和引用都保持有效。
本质上,这意味着:插入点之前的所有迭代器和引用都将不受影响,除非新的容器大小大于以前的容量,因为在这种情况下,所有元素都可能被移动到新的位置,从而使指向原始位置的指针/迭代器无效。由于resize()
只擦除/插入容器末尾的元素[注1]。控制因素可以归结为所请求的大小相对于当前容量。
因此产生了情况1的结果。
在情况2中,将调用std::vector::erase()
,这种情况下的无效规则为:
23.3.6.5矢量修饰符
迭代器擦除(const_iterator位置);
3效果:在擦除点处或之后使迭代器和引用失效。
由于[注1],元素将只在结束时删除,不需要重新定位所有元素。
。。。元素可以被移动到新的位置。">
请注意它表示可以移动的方式。因此,这意味着它取决于它是什么样的大小调整。
向量中的迭代程序无效有两个原因。在迭代器的位置之前插入/删除一个元素(1),或者如果向量需要增加其容量,则重新定位整个缓冲区(2)。这里的关键是更改capacity()
。
因为resize()
仅从容器的末端插入/移除。当向量收缩时,只有那些引用被移除元素的迭代器才会失效。当向量增长时,如果新的大小小于capacity()
,则没有迭代器将无效,如果新大小较大,则所有迭代器都将无效。
由于Als提供了不正确的证据1,我在这里添加了正确的引号:
23.3.6.5矢量修饰符
1[插入,推送_返回,模板,模板_返回]
备注:如果新大小大于旧容量,则导致重新分配。如果没有重新分配,则插入点之前的所有迭代器和引用都保持有效。
2[擦除]
效果:在擦除点处或之后使迭代器和引用失效。
类似的引号可以在C++03中找到。
1避免重复指示resize
等效于插入或擦除的引号。这是对的。
问题正文中的答案">当调整向量大小以容纳更多(或更少)元素时,其所有元素都可能移动到新位置。">
- 新分配指向函数的指针是否合法?
- STL算法和back_inserter可以预分配空间吗?
- 在函数返回中返回对新分配的shared_ptr的尊重合法吗
- 如何删除新分配的字符,这也是函数返回值?
- C ++中新分配的int的内存大小,有没有不同更好的方法来查看它?
- 编译器忽略运算符新分配
- 为阵列分配空间
- 如何为标准功能分配空间并做记忆
- 方法向量的新/分配的复杂性::p ush_back
- 有没有一种方法可以全局填充新分配/删除分配
- 分配空间时,我会收到非常不同的地址
- 为什么我的新分配指针会自动在程序退出上删除
- 在避免新分配的同时,const变量的复杂初始化
- 新分配的堆内存的初始内容 (VS2010)
- 如何为字符串数组实例变量动态分配空间
- 在C++中根据需要为数据结构分配空间
- 函数在无法分配空间时返回值
- 更改 malloc 函数分配空间
- 有没有办法在具有相同名称的新命名空间中嵌入类
- 使用 valuePtr() 等为 Eigen3 稀疏矩阵分配空间