C++ STL中链表(list)的概念与实现
C++标准模版库(STL)中的链表是通过std::list
类模板实现的。std::list
是一个双向链表,它提供了一种在序列中快速插入和删除元素的方式。
概念
- 双向链表:
std::list
是一个双向链表,每个节点包含指向上一个节点和下一个节点的指针。因此,可以从任意节点向前或向后遍历序列。 - 动态大小:
std::list
的大小可以动态改变,可以安全地添加或删除元素。 - 非连续存储:与
std::vector
不同,std::list
不提供连续的存储。因此,它不支持随机访问,无法使用下标操作符[]
来访问元素。 - 有效的插入和删除操作:在双向链表中,插入或删除一个元素的操作时间复杂度为常数时间(O(1)),如果位置已知。
常用操作
初始化
std::list<int> myList; // 创建一个空链表
std::list<int> myList2 = {1, 2, 3, 4}; // 使用初始化列表
元素访问
myList.front(); // 返回第一个元素
myList.back(); // 返回最后一个元素
迭代器
for (auto it = myList.begin(); it != myList.end(); ++it) {
std::cout << *it << " ";
}
// 使用范围循环
for (int value : myList) {
std::cout << value << " ";
}
修改
myList.push_back(10); // 在链表末尾添加元素
myList.push_front(0); // 在链表开头添加元素
myList.pop_back(); // 删除末尾元素
myList.pop_front(); // 删除开头元素
插入与删除
auto it = myList.begin();
std::advance(it, 2); // 将迭代器移动到第三个位置
myList.insert(it, 20); // 在第三个位置插入20
myList.erase(it); // 删除位置上的元素
其他操作
myList.size(); // 返回链表中的元素个数
myList.clear(); // 清除链表中的所有元素
myList.reverse(); // 反转链表
myList.sort(); // 排序链表
总结
std::list
提供了一种高效管理元素集合的方式,尤其在需要频繁插入和删除操作时十分有用。但由于非连续存储,随机访问性能较差,在需要频繁随机访问的场合,std::vector
可能是更好的选择。根据具体需求,选择合适的数据结构非常重要,以实现最佳性能。