4

假设您需要多次使用一个 STL 容器(set、map、queue)。哪种通用方法会更好?

  1. 每次创建容器。
  2. 每次都使用相同的全局对象,但要花一些时间来清除它。
// Option 1
void foo()
{
    set<int> S; //creating a new S each time foo is called.

    //use S...
}

// Option 2
set<int> S;
void foo()
{
    S.clear();

    //use S...
}
4

2 回答 2

4

如果不进行性能测试,我会告诉您,选项 2(重用)稍微快一点是直观的,因为您不是每次都构造和破坏容器。当你破坏容器时,它必须清除它,否则会出现内存泄漏。

但是,进行性能测试会产生不同的结果:

  • 对于 std::list,似乎clear比析构函数花费的时间更长。
  • 对于 std::set,结果几乎相同。
  • 对于 std::map,结果很接近,但选项 1(析构函数)稍微快一些。
  • 对于 std::vector,结果与 list 相似(尽管总体上 vector 快得多)

因此,总体而言,选项 1 似乎稍微快一些。我正在运行 VS2012,YMMV

于 2013-02-28T20:10:14.903 回答
0

假设您不必处理多线程问题,情况 2 可能更好。主要是因为对于一些标准的 lib 容器 clear 避免了内存分配。具体查看std::vector 的 clear function的文档。

清除不会导致内存重新分配,向量的容量不变。

于 2013-02-28T20:09:58.113 回答