📜  C++中前向列表和列表的区别(1)

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

C++中前向列表和列表的区别

在C++中,STL为我们提供了两种常用的列表,分别是前向列表和列表。虽然它们都能实现类似链表的操作,但是它们有很大的区别。下面将对它们进行介绍。

前向列表(Foward List)

前向列表是C++11中新增的列表,它和列表相比没有头部,只有一个指向第一个元素的指针。这种结构的好处是轻量级,内存占用小,插入和删除元素效率高。但缺点也显而易见,由于只有一个指针,访问元素时只能一次向后,不能向前,因此它的迭代器只有单向。使用前向列表需要引入头文件<forward_list>

下面是一个简单的前向列表示例:

#include <forward_list>
#include <iostream>

using namespace std;

int main() {
    forward_list<int> fl {1, 2, 3, 4, 5, 6};
    fl.push_front(0);
    fl.erase_after(fl.begin());
    for (auto i : fl) {
        cout << i << " ";
    }
    return 0;
}

在这个例子中,我们定义了一个包含1到6的前向列表,并在其头部插入了元素0。我们将要删除第二个元素(即2),由于前向列表只能向后访问,在删除元素时需要使用erase_after函数。最后,我们遍历列表,输出了所有元素。输出结果为0 3 4 5 6

列表 (List)

与前向列表不同,列表(list)是一个双向的链表结构,它包含头部和尾部,可以双向访问元素,删除和插入元素时效率也很高。但由于它的链表结构比较复杂,所以它比前向列表占用更多的内存。使用列表需要引入头文件<list>

下面是一个简单的列表示例:

#include <list>
#include <iostream>

using namespace std;

int main() {
    list<int> l {1, 2, 3, 4, 5, 6};
    l.push_front(0);
    auto it = l.begin();
    advance(it, 2);
    l.erase(it);
    for (auto i : l) {
        cout << i << " ";
    }
    return 0;
}

在这个例子中,我们定义了一个包含1到6的列表,并在其头部插入了元素0。我们使用advance函数随机访问列表中的元素,将第三个元素(即3)删除,并遍历输出所有元素。输出结果为0 1 4 5 6

总结

前向列表和列表都有各自的优点和缺点,根据实际应用的需求选择适合的容器是很重要的。如果你的应用中需要频繁插入或删除元素,并且只需要向后访问元素,那么选择前向列表是比较理想的;如果需要频繁双向访问元素,那么选择列表。