【发布时间】:2010-08-19 01:08:12
【问题描述】:
所有实现 resize 的 STL 容器都使用副本来填充新元素,即使副本的源是默认构造对象?
为什么会这样?
我认为没有优势和一些成本。
作为上下文,我在寻找 a random access container for elements that can't be copied 时遇到了这个问题:
【问题讨论】:
-
有什么选择?容器是否记得哪个元素是默认构造的,哪个元素被覆盖/复制到?这有点傻。你还有什么想法吗?
-
@Nikolai:为什么需要这样做?如果 resize 默认构造一个元素然后复制它 50 次(而不像现在这样跟踪它的来源)是可以的,为什么它会默认构造它 50 次不呢?
-
哦,我看错了这个问题。我可以想象原因是默认构造可能涉及分配,并且复制构造可能通过浅拷贝/引用计数/COW 来完成,就像 GNU
std::string实现一样。 -
这个问题是模棱两可的 - 因此尼古拉最初的困惑。请考虑从“新空间”更改为“用于附加元素的新空间”之类的内容,或者明确表明您不是在谈论将现有元素移入的“新空间”。您可以添加一个示例: size()==10;调整大小(20)->(如果重新分配 [0..9]'=[0..9]); [10]'=X(); [11]'=[10]...[19]'=[10] 与 ...[10]'=X()...[19]'=X(); Nikolai 的评论是我能想到的唯一理由,而且还不错。
标签: c++ stl design-choices