我会std::vector
在这种情况下开始,但适当地使用第二个std::vector
用于大规模突变reserve()
,然后swap()
是向量。
更新
它将采用以下一般形式:
std:vector<t_object*> source; // << source already holds 10000 elements
std:vector<t_object*> tmp;
// to minimize reallocations and frees to 1 and 1, if possible.
// if you do not swap or have to grow more, reserving can really work against you.
tmp.reserve(aMeaningfulReserveValue);
while (performingMassMutation) {
// "i scan through each element and lets every 20 elements"
for (twentyElements)
tmp.push_back(source[readPos++]);
// "every 20 elements i'll need to insert an new element"
tmp.push_back(newElement);
}
// approximately 500 iterations later…
source.swap(tmp);
Borealid 提出了一个很好的观点,那就是度量——执行会因您的标准库实现、数据大小、复制的复杂性等而发生巨大变化。
对于使用我的配置的这种大小的集合的原始指针,vector
质量突变及push_back
以上是std::list
插入速度的 7 倍。push_back
比vector
' 范围插入快。
正如 Emile 在下面指出的那样,std::vector::swap()
不需要移动或重新分配元素——它可以只换出内部(只要分配器类型相同)。