我需要一个动态改变大小的char数组。我不知道它有多大,所以预分配不是一种选择。它一次永远不会超过20个字节,下次它可能达到5kb ......
我希望分配就像一个标准向量。
我想过使用标准向量< char>但所有这些后退似乎都浪费时间:
strVec.clear();
for(size_t i = 0; i < varLen; ++i)
{
strVec.push_back(0);
}
这是我能做的最好吗?还是有办法一次向矢量添加一堆物品?或者也许是一种更好的方法。
由于
答案 0 :(得分:3)
std::vector
时, push_back
都不会分配内存,但只有当大小超过容量时才会分配内存
答案 1 :(得分:2)
首先,在您分析代码并确定存在瓶颈之前不要进行优化。通过巧妙地做一些事情来考虑可读性,可访问性和可维护性的成本。确保您采取的任何计划不会妨碍您将来使用Unicode。还在?好的。
正如其他人所提到的,矢量保留的内存比最初使用的内存多,而push_back通常非常便宜。
然而,有些情况下使用push_back会重新分配内存。例如,对myvector.push_back()的一百万次调用可能会触发myvector的10或20次重新分配。另一方面,在其末端插入向量将导致myvector *的最多1次重新分配。出于速度和可读性的原因,我通常更喜欢将插入习惯用于reserve / push_back习语。
myvector.insert(myvector.end(), inputBegin, inputEnd)
如果您事先不知道字符串的大小并且不能容忍重新分配造成的打嗝,可能是因为硬实时约束,那么也许您应该使用链表。链表将以平均性能差得多的价格具有一致的性能。
如果所有这些都不足以满足您的目的,请考虑其他数据结构,例如rope或回复更多有关您案例的详细信息。
答案 2 :(得分:1)
您可以使用resize
成员函数添加一堆。但是,我不希望push_back
变慢,特别是如果向量的内部容量已经非常重要。
答案 3 :(得分:1)
这是我能做的最好吗?还是有办法一次向矢量添加一堆物品?或者也许是一种更好的方法。
push_back
不是很慢,它只是将大小与当前容量进行比较,并在必要时重新分配。由于CPU上的分支预测和超标量执行,比较可能基本上为零时间。重新分配执行O(log N)次,因此向量使用的内存最多为所需内存的两倍,但重新分配所花费的时间很少会增加任何内容。
要一次插入多个项目,请使用insert
。有一些重载,唯一的技巧是你需要明确传递end
。
my_vec.insert( my_vec.end(), num_to_add, initial_value );
my_vec.insert( my_vec.end(), first, last ); // iterators or pointers
对于第二种形式,您可以先将值放在数组中,然后将数组复制到向量的末尾。但这可能会增加复杂性。这就是微优化的方式。如果您知道可以获得可衡量的收益,则只尝试进行优化。