某日二师兄参加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
...
};

在C++面试中,二师兄讨论了std::vector和std::list的实现原理、性能特点以及适用场景。std::list是一个双向链表,从C++11开始,其节点包含长度信息,提供常数时间复杂度的插入和删除操作。而std::vector适合随机访问和频繁的元素访问,但插入和删除可能导致迭代器失效。在需要高效随机访问和节省内存时,std::vector优于std::list。遍历效率方面,std::vector通常由于空间局部性而优于std::list。面试官还提及了std::forward_list和迭代器失效的问题。
最低0.47元/天 解锁文章
1287

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



