
🎈主页传送门:良木生香
🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》《鼠鼠的C++学习之路》 《Linux系统编程》
🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离

前言:在此之前,我们已经学习了STL中的vector和string类的用法,是我们对于STL库有了一个基本的认识,那么今天我们就继续往下学习另外一个STL库中常用的容器:List。
目录
[2.1、list 构造/析构函数:](#2.1、list 构造/析构函数:)
[2.2、list Iterator(迭代器)](#2.2、list Iterator(迭代器))
[2.3、list capacity](#2.3、list capacity)
[2.4、list Elememt access](#2.4、list Elememt access)
[2.5、list Modifiers](#2.5、list Modifiers)
一、list介绍
list文档相关链接:list - C++ Reference
list在官方的定义中是:**带头节点双向循环链表,**图解如下:

二、list接口介绍与基本使用方法
在list这个类中,官方提供的接口比较多,用起来可能会比较复杂,但是也和之前的vector和string类有相似之处,所以本文将会以下面都板块的顺序对list进行讲解:

2.1、list 构造/析构函数:
list构造函数链接:list构造函数
总结如下(以int类型为例):
|-------------------------------------------------------------------|---------------------------------|
| list() | 默认构造一个空的list链表 |
| list (size_type n, const value_type& val = value_type()) | 用n个值为val的元素构造list链表 |
| list (const list& x) | 用x链表对list链表进行拷贝构造 |
| list (InputIterator first, InputIterator last) | 用[ first,last)区间的元素对list链表进行构造 |
具体实现代码如下:

运行结果为:

析构函数的话,一般不用自己实现,库里面已经帮你搞定了:
析构函数:list析构函数
2.2、list Iterator(迭代器)
list的迭代器大家可以将他理解为像指针一样的东西,指向的就是链表中的某个节点,具体的详细说法可以参考这篇文章:
【数据结构-初阶】详解线性表(3)---双链表-CSDN博客
这里或许能更好的帮助大家理解双链表。
文档中的指针大概总结如下:
**begin() /**end()
**rbegin() /**rend()
如果在各自的前面再加上c,那就代表着对象是const对象。
|-----------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------|
| begin()+end() | 返回第一个元素的迭代器 + 返回最后一个元素下一个位置的迭代器 |
| rbegin()+rend() | 返回第一个元素的 reverse_iterator, 即 end 位置 , 返回最后一个元素下一个位 置的 reverse_iterator, 即 begin 位置 |
图解如下:

【注意】
1. begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动
2. rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动
使用示例:

运行结果为:

2.3、list capacity
capacity中的接口就比较少了:

一个是判空,一个是返回链表大小,一个是返回链表的最大节点数量

使用示例如下:

运行结果为:

2.4、list Elememt access

使用实例:

运行结果为:

2.5、list Modifiers

使用实例:

运行结果如下:

在list链接中还有一些其他的操作,平时使用的频率不是很大,所以大家可以自行查阅,这里就不过多展示了~~~
三、测试代码
本篇文章的所有代码在这里汇总了:
cpp#include<iostream> #include<list> #include<string> using namespace std; template<class T> void printf_list(const list<T>& list) { for (auto e : list) { cout << e << " "; } cout << endl; } void test_list() { list<int> list_total({ 10,20,30,40,50,60,70,80 }); list<int>::iterator it_total = list_total.begin(); it_total++; it_total++;//指向30 list<int> list1; //默认构造---空的list list<int> list2(5, 10); //用5个10来初始化list2 list<int> list3(list2); //将list2拷贝以初始化list3 list<int> list4(it_total, list_total.end()); cout<<"初始化列表构造:"; printf_list(list_total); cout << "默认构造:"; printf_list(list1); cout << "用n个val值进行构造:"; printf_list(list2); cout << "拷贝构造:"; printf_list(list3); cout << "迭代器区间构造:"; printf_list(list4); } void test_list2(){ string s = "hello world"; list<int> list1 = { 10,20,30,40,50,60,70 }; list<int>::iterator it_begin = list1.begin(); list<int>::iterator it_end = list1.end(); list<int>::reverse_iterator it_rbegin = list1.rbegin(); list<int>::reverse_iterator it_rend = list1.rend(); for (list<int>::iterator it = it_begin; it != it_end; it++) { cout << *it << " "; } cout << endl; for (list<int>::reverse_iterator it = it_rbegin; it != it_rend; it++) { cout << *it << " "; } cout << endl; } void test_list3() { list<int> list1 = { 10,20,30,40,50,60,70,80,90,100 }; cout << list1.size() << endl; if (list1.empty()) { cout << "链表为空" << endl; } else { cout << "链表不为空" << endl; } cout << list1.max_size() << endl; } void test_list4() { list<int> list1({ 10,20,30,40,50,60 }); cout << list1.front() << endl; cout << list1.back() << endl; } void test_list5() { list<int> list1({ 10,20,30 }); cout << "original_list:"; printf_list(list1); cout << endl; list1.push_front(999); list1.push_front(666); cout << "push_front():"; printf_list(list1); cout << endl; list1.pop_front(); cout << "pop_front():"; printf_list(list1); cout << endl; list1.push_back(520); list1.push_back(999); cout << "push_back():"; printf_list(list1); cout << endl; list1.pop_back(); cout << "pop_back():"; printf_list(list1); cout << endl; list<int>::iterator it = list1.begin(); it++; list1.insert(it, 555); cout << "insert:"; printf_list(list1); cout << endl; it++; it++; list1.erase(it); cout << "erase:"; printf_list(list1); cout << endl; list<int> list2 = { 111,222,333,444,555,666 }; cout << "before_Swap:" << endl; printf_list(list1); printf_list(list2); cout << endl; cout << "after_Swap:" << endl; list1.swap(list2); printf_list(list1); printf_list(list2); cout << endl; list1.clear(); cout << "clear():"; printf_list(list1); } int main() { //test_list(); //test_list2(); //test_list3(); //test_list4(); test_list5(); return 0; }
以上就是我对list基本接口的分享了,感谢大佬们的阅读~~~
文章是自己写的哈,有啥描述不对的、不恰当的地方,恳请大佬指正,看到后会第一时间修改,感谢您的阅读。