在insert
上调用std::vector
成员函数时,在“推回”新项目之前会reserve
吗?我的意思是标准保证与否?
换句话说,我应该这样做:
std::vector<int> a{1,2,3,4,5};
std::vector<int> b{6,7,8,9,10};
a.insert(a.end(),b.begin(),b.end());
或者像这样:
std::vector<int> a{1,2,3,4,5};
std::vector<int> b{6,7,8,9,10};
a.reserve(a.size()+b.size());
a.insert(a.end(),b.begin(),b.end());
还是其他更好的方法?
答案 0 :(得分:13)
关于函数[link]的复杂性:
插入元素数量的线性(复制/移动构造) 加上位置(移动)后的元素数量。
此外,如果插入(3)范围内的InputIterator不是至少 一个前向迭代器类别(即,只是一个输入迭代器)的新的 容量不能预先确定,插入就会产生 额外的对数复杂度(重新分配)。
因此,有两种情况:
reserve
应该很有用。答案 1 :(得分:2)
std::vector::insert
按定义保留吗?
是的,没有;取决于当前的容量。
从N4567草案,§23.3.6.5/ 1([vector.modifiers]):
如果新尺寸大于旧容量,则会导致重新分配。
如果vector
中分配的内存容量足以容纳新元素,则不需要为vector
分配额外的分配。所以不,那么它就不会保留记忆。
如果vector
容量不够大,则分配新块,移动/复制当前内容并插入新元素。没有指定确切的分配算法,但通常它将在reserve()
方法中使用。
......还是其他更好的方法?
如果您在将元素插入vector
时担心分配过多,那么调用reserve
方法的大小与要添加的预期元素的数量会最小化分配。
在{/ 1}插入之前,
vector
是否会调用reserve
?即它是否在单个分配中分配了足够的容量?
无保证。它如何知道输入迭代器之间的距离?鉴于insert
方法可以采用InputIterator(即单遍迭代器),它无法计算预期的大小。 如果迭代器中有其他内容(例如指针或RandomAccessIterator),该方法可以计算大小吗?是的,它可以。 它会吗?取决于实施和优化。
答案 2 :(得分:1)
从documentation,似乎:
如果新size()大于旧容量(),则会导致重新分配。
还要注意,在这种情况下,所有迭代器和引用都将失效。
不言而喻,重新分配负责let currentGroup = current[0] as APIGroup
,如果你当时看一下那些操作,它就像一个一致的保留大小加一个每一步都要进行操作
您可以争辩说,插入顶部的insert
调用可以加快发生多个重新分配的情况下的所有情况......嗯,对,它可能会有所帮助,但这主要取决于您的实际问题