vector::shrink_to_fit 是否允许重新分配?

Is vector::shrink_to_fit allowed to reallocate?

提问人:soulie 提问时间:12/17/2012 最后编辑:ildjarnsoulie 更新时间:12/19/2012 访问量:646

问:

这个成员函数在标准中没有定义的影响(只有备注),如果不允许重新分配,它的用途将受到限制。但我在标准中找到的唯一似乎适用的段落是 23.2.1/11:

“除非另有规定(无论是显式还是通过根据其他函数定义函数),否则调用容器成员函数或将容器作为参数传递给库函数不应使该容器中对象的迭代器无效或更改其值。”

既然重新分配会使迭代器无效,这是否意味着shrink_to_fit不能正式重新分配?如果是这样,该函数只能对减少容量不会重新分配的实现产生影响,如果有的话......

C++ C++11 标准

评论


答:

9赞 Jonathan Wakely 12/17/2012 #1

我同意,意图显然是可以重新分配的,所以应该允许它使迭代器无效。shrink_to_fit()

只有当实现为分配器提供类似 -like 的功能时,才有可能接受请求,该功能保证在收缩块时不会移动内存,这不会使迭代器无效。但我不认为这是预期的,正如最近在向量中添加的要求所暗示的那样,因为该要求仅在元素移动到新位置时才相关,这将使迭代器无效。realloc()TMoveInsertable

我认为您应该提交一个问题来澄清它,这可能会使迭代器无效。该问题将适用于 和 。shrink_to_fit()basic_stringdequevector

评论

0赞 soulie 12/17/2012
T 是 MoveInsertable 的要求在哪里?
1赞 Jonathan Wakely 12/17/2012
23.3.6.3 [vector.capacity] 第7段 在当前工作文件中,LWG 2033在C++11之后添加。注意,这个术语是“进入 X”,说一个类型是没有意义的,你只需要说出你要把它插入什么MoveInsertableMoveInsertable
0赞 soulie 12/17/2012
当然,这些添加物在很大程度上阐明了该功能的预期效果。