C++: std::vector::resize与“普通”分配的区别

3
std::transform的代码示例中,有一个代码如下的示例:
std::vector<int> foo;
std::vector<int> bar;

//add some elements to foo

bar.resize(foo.size());

//store elements transformed from foo's in bar

我在想是否

std::vector<int> bar;    
bar.resize(foo.size());

与之前的不同之处

std::vector<int> bar(foo.size());

如果需要,那么如何实现?
2个回答

5

不,没有区别。至少在你展示的方式中没有区别(在定义bar和调用resize之间没有插入到foo中)。


内部数组的初始分配怎么样?是推迟到第一次插入吗?这是由标准定义还是实现特定细节? - odyss-jii
@odyss-jii,没有查看标准,但是阅读了这个std::vector构造函数的参考文献(其中指出例如设置大小的构造函数是“与计数成线性关系”),我认为内存会立即分配和初始化。 - Some programmer dude
那么我猜默认构造函数中有一个特定于实现的初始数组大小?如果是这样,那么OP两个片段之间特定于实现的微小差异将会是第一种情况下多了一个删除和数组分配。 - odyss-jii
@odyss-jii 不,默認構造函數會創建一個大小為零的向量(並且不需要分配任何內存),在默認構造的向量中,任何元素訪問都是越界的。 - Some programmer dude
好的,零大小的向量没错,但这并不能说明内部数组的情况(请参见capacityreserve方法)。我猜这取决于使用的分配器以及何时调用它。 - odyss-jii

4

没有区别,只是后者更加高效和简洁一点。


2
而且稍微不太清楚正在发生什么……第二种方式是创建具有大小值的单个项还是大小向量?我们都知道,但不那么熟练的用户会发现第一种形式更清晰。尽管如此,我认为这并不值得采用第一种方式。 - Mike Vine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接