【C++ STL应用与实现】6: 如何使用std::list

本文详细介绍了C++标准模板库中的list容器,包括双向链表的基本用法、成员函数及注意事项,并通过示例代码展示了如何高效地使用list。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本系列文章的目录在这里:目录. 通过目录里可以对STL总体有个大概了解

前言

list是stl对链表数据结构的一种支持,其通常被实现为双向链表。本文介绍了list的基本用法以及在使用list时需要注意的一些问题。

list 是什么

list是一个class template,要用它需包含#include <list>

基本用法示例

下面的代码改编自《The C++ Standard Library》第二版


// 定义两个int list
list<int> list1, list2;

// 插入元素
for (int i=0; i<6; ++i) {
    list1.push_back(i);
    list2.push_front(i);
}

printList(list1, "after push, list1: ");             
printList(list2, "after push, list2: ");            


// 把list1全部移到list2中,位置是list2中第一个等于3的元素之前
list2.splice(find(begin(list2), end(list2), 3), list1);
printList(list1, "list1, after splice: ");                        // empty
printList(list2, "list2, after splice: ");   

// 把list2的第一个元素移到其末尾
list2.splice(end(list2), list2, begin(list2));
printList(list2, "list2, move begin to end: ");   

// list的成员函数sort
list2.sort();
list1 = list2;
list2.unique();     // 去掉重复

printList(list1, "list1, after assign: ");             
printList(list2, "list2, after sort & unique: ");            

list1.merge(list2);  // 合并两个链表
printList(list1, "list1, after merge: ");
printList(list2, "list2, after merge: ");

auto printList = [](const list<int> &l, const string &info="") {
    p(info);
    for (auto &i : l) {
        p(i); p(" ");
    }
    cr;
};

输出:

after push, list1: 0 1 2 3 4 5
after push, list2: 5 4 3 2 1 0
list1, after splice:
list2, after splice: 5 4 0 1 2 3 4 5 3 2 1 0
list2, move begin to end: 4 0 1 2 3 4 5 3 2 1 0 5
list1, after assign: 0 0 1 1 2 2 3 3 4 4 5 5
list2, after sort & unique: 0 1 2 3 4 5
list1, after merge: 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
list2, after merge:

list需要注意的点

0. 由于其链表特性,实现同样的操作,相对于stl中的通用算法, list的成员函数通常有更高的效率,内部仅需做一些指针的操作,因此尽可能选择list成员函数。

1. 正如你选择数组或链表来完成任务的理由一样,原则同样适用于vector和list的选择,包括常见操作的时间复杂度、需随机访问的算法的支持等。

源码及参考链接


作者水平有限,对相关知识的理解和总结难免有错误,还望给予指正,非常感谢!

在这里也能看到这篇文章:github博客, 优快云博客, 欢迎访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值