📜  C++ STL中list和forward_list的映射及示例(1)

📅  最后修改于: 2023-12-03 14:59:46.208000             🧑  作者: Mango

C++ STL中list和forward_list的映射及示例

在C++ STL中,list和forward_list是两种常用的链表容器,它们提供了一种线性存储结构,可以方便地在任意位置进行插入和删除操作。下面分别介绍它们的特点以及用法示例。

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

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。