
std::list
list
list
std::list
想象一下,你有一串珠子,它们之间用线连着。如果你想在中间加一颗新珠子,你只需要剪断一根线,把新珠子接上去,再用另一根线把它和下一颗珠子连起来就行了。整个过程只涉及局部操作。
std::list
然而,这种非连续存储的特性也带来了明显的缺点。如果你想访问第N个元素,
list
std::vector
list
立即学习“C++免费学习笔记(深入)”;
此外,由于每个元素都带有额外的指针开销,
list
vector
list
在我看来,
std::list
std::vector
std::deque
std::vector
vector
vector
vector
std::deque
vector
list
vector
deque
vector
vector
deque
回到
std::list
vector
deque
list
总结来说:
vector
deque
vector
list
list
选择哪个容器,完全取决于你的具体需求和操作模式。没有哪个是“最好”的,只有“最适合”的。
要深入理解
std::list
通常,一个
std::list
template <typename T>
struct _List_node {
T _M_data; // 存储实际的数据
_List_node* _M_prev; // 指向前一个节点的指针
_List_node* _M_next; // 指向后一个节点的指针
};这里我用了
_M_data
_M_prev
_M_next
_M_data
list
int
std::string
_M_prev
_M_next
更巧妙的是,为了简化边界条件(比如空列表、第一个元素、最后一个元素等)的处理,
std::list
想象一个空
list
_M_prev
_M_next
[哨兵节点] <-> [哨兵节点]
当插入第一个元素时,比如
value
[哨兵节点] <-> [value节点] <-> [哨兵节点]
此时,哨兵节点的
_M_next
value
value
_M_prev
value
_M_next
_M_prev
value
begin()
_M_next
end()
当你在
list
current_node
new_node
new_node->_M_next = current_node;
new_node->_M_prev = current_node->_M_prev;
current_node->_M_prev->_M_next = new_node;
current_node->_M_prev = new_node;
可以看到,整个过程只涉及了四个指针的修改,与链表长度无关,这就是O(1)效率的来源。
尽管
std::list
1. 糟糕的缓存局部性(Cache Locality)
这绝对是
std::list
list
list
std::vector
list
2. 内存开销大
每个
list
char
short
char
3. 随机访问效率低下
这我们已经提过多次,但它的重要性值得再次强调。如果你需要通过索引(比如
list[5]
list
std::find
list
vector
unordered_map
map
4. std::list::sort()
std::list
sort()
std::sort()
std::sort()
list
list
sort()
std::sort
list
5. 何时它真正闪光:splice
std::list
splice
list
list
list
vector
deque
std::list
splice
总而言之,
std::list
std::vector
std::deque
以上就是C++ list容器特性 双向链表实现原理的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号