std :: list.size()如何具有恒定的复杂性?

And*_*oen 1 c++ linked-list c++11

在学校,我了解到一个链表包含一个指向列表中下一个元素的指针的元素,链表的缺点是找到大小具有线性复杂性,因为你必须遍历每个元素并计算.但是我注意到在C++ 11中,std :: list.size()具有恒定的复杂性.这怎么可能?

Yak*_*ont 7

怎么样容易 它缓存它.你可以缓存任何东西,只要你不让它变得无效.保持缓存有效有多难?1

为什么在C++ 11中?这是什么意思?

在C++ 11之前,std::list::size没有提到它有多复杂.

一些实现保持大小字段,而其他实现没有.保持大小字段的优点.size()是恒定的时间; 不是的优点是一些拼接操作可以在恒定的时间内完成.

通过size()跟踪,拼接操作需要计算拼接的节点.这使它无法保持恒定时间,并且变为O(n).

C++ 11决定,因为所有其他.size()函数都是恒定时间,所以它们还要求list具有恒定的时间大小.这打破了某些人std::list的ABI ,并阻止了不断的时间拼接.


1计算机编程存在两个难题.命名事项,缓存失效,以及关闭一个错误.


Cor*_*mer 6

只要保持一个成员变量,只要你添加或删除元素就会更新.或者,如果将两个列表合并在一起,只需将它们的计数相加即可

然后,您不必遍历整个列表只是为了计算元素.