-1

我需要一个大小会动态变化的 char 数组。我不知道它可以有多大,所以预分配不是一种选择。它永远不会超过 20 字节 1 次,下一次它可能会达到 5kb ......

我希望分配就像一个标准向量。

我想过使用标准向量 < char > 但所有这些推回似乎都在浪费时间:

strVec.clear();
for(size_t i = 0; i < varLen; ++i)
{
   strVec.push_back(0);
}

这是我能做的最好的事情,还是有办法一次将一堆项目添加到向量中?或者也许是更好的方法来做到这一点。

谢谢

4

4 回答 4

3

std::vector每次调用时都不会分配内存push_back,但只有在大小变得大于容量时才分配内存

于 2012-05-12T00:02:43.550 回答
2

首先,在分析代码并确定存在瓶颈之前不要进行优化。通过做一些聪明的事情来考虑可读性、可访问性和可维护性的成本。确保您采取的任何计划都不会妨碍您将来使用 Unicode。还在?好吧。

正如其他人所提到的,向量保留的内存比它们最初使用的更多,并且 push_back 通常非常便宜。

但是,在某些情况下,使用 push_back 重新分配的内存超出了必要的范围。例如,对 myvector.push_back() 的一百万次调用可能会触发 myvector 的 10 或 20 次重新分配。另一方面,在其末尾插入向量将导致 myvector* 最多 1 次重新分配。出于速度和可读性的原因,我通常更喜欢插入习语而不是 reserve / push_back 习语。

myvector.insert(myvector.end(), inputBegin, inputEnd)

如果您事先不知道字符串的大小并且不能容忍由重新分配引起的打嗝,可能是因为硬实时限制,那么也许您应该使用链表。链表将以更差的平均性能为代价获得一致的性能。

如果所有这些都不足以满足您的目的,请考虑其他数据结构,例如绳索或回发有关您的案例的更多细节。

  • 来自 Scott Meyer 的 Effective STL,IIRC
于 2012-05-12T04:28:18.560 回答
1

您可以使用resize成员函数添加一堆。但是,我不认为这push_back会很慢,特别是如果向量的内部容量已经很重要。

于 2012-05-11T23:57:52.460 回答
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

对于第二种形式,您可以先将值放入数组中,然后将数组复制到向量的末尾。但这可能会增加和消除一样多的复杂性。这就是微优化的方式。仅当您知道有可衡量的收益时才尝试优化。

于 2012-05-12T04:50:39.810 回答