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

Ben*_*man 1 c++ performance stack stl

我正在为自己编写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;
  }
}
Run Code Online (Sandbox Code Playgroud)

但它比STL的速度慢得多.

erase(--end());
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么迭代器擦除更快?

Ste*_*hen 5

因为delete topE.

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

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

接下来就是(看起来像)你正在使用链表来存储堆栈.这将是wayyyy比默认的STL容器较慢(SGI使用deque),因为你会失去缓存位置,需要动态分配的每个元素(new/ delete) -而deque将动态地在时间分配堆栈块.

你说得最好:

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

至少现在:)尝试看看你有多接近!