📅  最后修改于: 2023-12-03 14:59:46.208000             🧑  作者: Mango
在C++ STL中,list和forward_list是两种常用的链表容器,它们提供了一种线性存储结构,可以方便地在任意位置进行插入和删除操作。下面分别介绍它们的特点以及用法示例。
list是一种双向链表容器,每个节点包含一个数据元素和两个指针,一个指向前驱节点,一个指向后继节点。list支持随机访问操作,但相比于vector等其他序列容器来说,它的访问效率较低,因为它不支持常数时间内的索引访问。
list的用法和其他STL容器差不多,可以使用push_back, push_front, insert等方法添加元素,使用erase删除元素,使用size获取元素个数等。同时,它还提供了自带的排序函数sort(),可以对链表进行快速排序。
#include <iostream>
#include <list>
using namespace std;
int main() {
list<int> l{ 4, 2, 3, 1 };
// 对链表进行排序
l.sort();
// 输出链表中的每个元素
for (int& x : l) {
cout << x << ' ';
}
cout << endl;
// 在链表头部添加一个元素
l.push_front(5);
// 在链表尾部添加一个元素
l.push_back(0);
// 删除链表中的第二个元素
l.erase(++l.begin());
// 输出链表中的每个元素
for (int& x : l) {
cout << x << ' ';
}
cout << endl;
return 0;
}
输出结果为:
1 2 3 4
5 3 4 0
除此之外,list还提供了unique()函数和remove()函数,用于去重和删除指定元素。
forward_list是一种单向链表容器,每个节点包含一个数据元素和一个指针,指向下一个节点。它不支持双向遍历和逆向迭代,但相比于list来说,它的空间占用和迭代效率都更高。
forward_list的用法和list类似,可以使用push_front, insert等方法添加元素,使用erase删除元素,使用size获取元素个数等。但由于不支持双向访问,因此它的操作也更加受限。比如,reverse()函数就无法对单向链表进行反转。
#include <iostream>
#include <forward_list>
using namespace std;
int main() {
forward_list<int> fl{ 2, 3, 1, 4 };
// 输出链表中的每个元素
for (int& x : fl) {
cout << x << ' ';
}
cout << endl;
// 在链表头部添加一个元素
fl.push_front(5);
// 删除链表中的第一个元素
fl.pop_front();
// 在链表中间添加一个元素
fl.insert_after(++fl.begin(), 0);
// 删除链表中的第二个元素
fl.erase_after(fl.begin());
// 输出链表中的每个元素
for (int& x : fl) {
cout << x << ' ';
}
cout << endl;
return 0;
}
输出结果为:
2 3 1 4
3 0 4
除此之外,forward_list还提供了remove()函数,可以删除指定元素。
总的来说,list和forward_list都是非常适合于频繁插入删除操作的容器,选择哪种容器取决于具体的应用场景。如果需要更加灵活的操作(比如排序),可以选择list;如果需要更高的内存利用率和迭代效率,可以选择forward_list。