C ++:std :: stack :: pop()方法的速度

时间:2010-07-14 18:55:19

标签: c++ performance stl stack

我正在为自己从STL写一些容器的较轻版本。

(我知道STL是由专业程序员编写的,如果我认为我可以写得比他们更好,我就太愚蠢或太野心勃勃。当我写下我的列表时(只用我需要的方法),它工作了几次因此,我认为这是一个好主意。但是,无论如何。)

我对std::stack::pop()的速度感到失望。我瞥了一眼souses,发现没有很好的算法。就像我一样,我想:

void pop()
{
  if(topE) // topE - top Element pointer
  {
     Element* n_t = topE->lower; // element 'under' that one
     delete topE;
     topE = n_t;
  }
}

但它比STL的速度慢得多。

erase(--end());

有人可以解释为什么迭代器擦除更快吗?

2 个答案:

答案 0 :(得分:5)

由于delete topE

使用STL(至少对于SGI实现),pop()上没有自动删除。如果您已动态分配堆栈中的元素,则在调用pop()之前由您解除分配。

STL pop只是将堆栈大小缩短一个(并销毁最后一个对象 - 不一定是堆删除)。

接下来就是(看起来像)你正在使用链表来存储堆栈。这将比默认的STL容器(SGI使用deque)慢 wayyyy ,因为您将丢失缓存局部性并需要为每个元素(new / {{进行动态分配1}}) - 而delete将一次动态分配堆栈的块。

你说得最好:

  

STL是由专业程序员编写的,如果认为我能写得比他们写得好,我就太愚蠢或太野心了

至少目前为止:)试试看你有多接近!

答案 1 :(得分:3)

标准库stack的性能有点难以说明,因为它是容器适配器,而不是容器本身。所有操作都通过(最多)次要修改传递到底层容器。

但有几个显而易见的可能性。首先,你显然是在使用链表;默认情况下,std::stack将使用向量,至少在内存服务时。其次,它只是擦除了破坏对象的项目,但是没有释放底层内存。你的似乎破坏了对象删除内存。