我正在为自己从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());
有人可以解释为什么迭代器擦除更快吗?
答案 0 :(得分:5)
由于delete topE
。
使用STL(至少对于SGI实现),pop()
上没有自动删除。如果您已动态分配堆栈中的元素,则在调用pop()
之前由您解除分配。
STL pop只是将堆栈大小缩短一个(并销毁最后一个对象 - 不一定是堆删除)。
接下来就是(看起来像)你正在使用链表来存储堆栈。这将比默认的STL容器(SGI使用deque
)慢 wayyyy ,因为您将丢失缓存局部性并需要为每个元素(new
/ {{进行动态分配1}}) - 而delete
将一次动态分配堆栈的块。
你说得最好:
STL是由专业程序员编写的,如果认为我能写得比他们写得好,我就太愚蠢或太野心了
至少目前为止:)试试看你有多接近!
答案 1 :(得分:3)
标准库stack
的性能有点难以说明,因为它是容器适配器,而不是容器本身。所有操作都通过(最多)次要修改传递到底层容器。
但有几个显而易见的可能性。首先,你显然是在使用链表;默认情况下,std::stack
将使用向量,至少在内存服务时。其次,它只是擦除了破坏对象的项目,但是没有释放底层内存。你的似乎破坏了对象和删除内存。