某日二师兄参加XXX科技公司的C++工程师开发岗位第24面:
面试官:
list用过吗?二师兄:嗯,用过。
面试官:请讲一下
list的实现原理。二师兄:
std::list被称为双向链表,和C中手写双向链表本质上没有大的区别。list对象中有两个指针,一个指向上一个节点(node),一个指向下一个节点(node)。二师兄:与手写双向链表不同的是,
list中有一个base node,此node并不存储数据,从C++11开始,此node中包含一个size_t类型的成员变量,用来记录list的长度。二师兄:所以说从C++11开始,
size()的时间复杂度是O(1),在此之前是O(N)。面试官:是每个
node都包含一个记录长度的成员变量吗?二师兄:不是,GCC中的实现只有在
header node上记录了长度信息,其他node并没有记录。
struct _List_node_base
{
_List_node_base* _M_next;
_List_node_base* _M_prev;
...
};
struct _List_node_header : public _List_node_base
{
#if _GLIBCXX_USE_CXX11_ABI
std::size_t _M_size;
#endif
...
};
747




被折叠的 条评论
为什么被折叠?



