C++ list容器的使用
list 容器以双向链表形式实现,list 容器通过指针将前面的元素和后边的元素链接到一起。
list 容器的存储结构如图 1 所示。

图1 list容器的存储结构
与 vector 容器和 deque 容器相比,list 容器只能通过迭代器访问元素,不能通过索引方式访问元素。因为同为序列容器,list 容器的接口大部分与 vector 和 deque 容器都相同,所以读者学习起来也比较容易。
下面讲解 list 容器的常见用法。
创建 list 容器的几种常见方式如下所示:
此外,list 容器也支持迭代器访问元素,提供了
list 迭代器的用法与 vector 迭代器相同。
list 容器也提供了多个函数用于删除元素,可以从头尾两端删除元素,也可以删除中间任意一个元素。
list 各个删除函数调用形式如下所示:
【示例1】下面通过案例演示 list 容器的使用,C++ 代码如下:
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
list 容器的存储结构如图 1 所示。

图1 list容器的存储结构
与 vector 容器和 deque 容器相比,list 容器只能通过迭代器访问元素,不能通过索引方式访问元素。因为同为序列容器,list 容器的接口大部分与 vector 和 deque 容器都相同,所以读者学习起来也比较容易。
下面讲解 list 容器的常见用法。
1) 创建list容器
list 类模板中也实现了多个重载构造函数,因此 list 容器的创建也有多种方式。创建 list 容器的几种常见方式如下所示:
list<T> lt; //创建一个空的 list 容器 lt list<T> lt(n); //创建一个 list 容器 lt,大小为 n list<T> lt(n, elem); //创建一个 list 容器 lt,包含 n 个 elem 元素 list<T> lt(begin, end); //创建一个 list 容器 lt,用 [begin, end) 区间的值为元素赋值 list<T> lt(lt1); //创建一个 list 容器 lt,用容器 lt1 初始化
2) 赋值
list 容器也提供了 assign()
函数为容器元素赋值,assign() 函数有两种重载形式,分别如下所示:
lt.assign(n, elem); //将 n 个 elem 元素的值赋给 lt lt.assign(begin, end); //用 [begin, end) 区间的值给 lt 中的元素赋值在 list 容器中,assign() 函数的用法和 vector 中的 assign() 函数用法一样,这里不再举例说明。
3) 元素访问
因为 list 容器是由链表实现的,内存区域并不连续,所以无法用“[]”运算符访问元素,也没有可随机访问元素的 at() 方法,但 list 容器提供了 front() 函数和 back() 函数用于获取头部元素和尾部元素。此外,list 容器也支持迭代器访问元素,提供了
iterator
、const_iterator
、reverse_iterator
和 const_reverse_iterator
四种迭代器,还提供了获取这四种迭代器的成员函数。list 迭代器的用法与 vector 迭代器相同。
4) 插入元素和删除元素
list 容器提供了多个函数用于向容器中添加元素,这些函数调用形式如下所示:lt.push_back(); //在尾部插入元素 lt.push_front(); //在头部插入元素 lt.insert(pos, elem); //在pos位置插入元素elem lt.insert(pos, n, elem); //在pos位置插入n个元素elem lt.insert(pos, begin, end); //在pos位置插入[begin, end)区间的值作为元素上述函数的用法与 deque 容器中的函数用法一样,即 list 容器可以从头尾两端添加元素,也可以从中间添加元素。
list 容器也提供了多个函数用于删除元素,可以从头尾两端删除元素,也可以删除中间任意一个元素。
list 各个删除函数调用形式如下所示:
lt.pop_back(); //从尾部删除元素 lt.pop_front(); //从头部删除元素 lt.erase(pos); //从中间删除元素 lt.erase(begin, end); //删除[begin, end)区间的元素 lt.remove(elem); //从容器中删除所有与elem匹配的元素
【示例1】下面通过案例演示 list 容器的使用,C++ 代码如下:
#include<iostream> #include<list> using namespace std; template<typename T> void print(list<T> mylist) //定义函数模板,输出list容器元素 { typename list<T>::iterator it; //创建list的iterator迭代器 for(it = mylist.begin(); it != mylist.end(); it++) cout << *it << " "; cout << endl; } int main() { list<int> lt; //创建空的list容器lt for(int i = 0; i < 10; i++) lt.push_back(i + 1); //向容器中添加元素 cout << "输出list容器中的元素:" << endl; print(lt); lt.pop_back(); //删除最后一个元素 lt.push_front(5); //在头部添加元素5 cout << "再次输出list容器中的元素:" << endl; print(lt); lt.remove(5); cout << "删除5之后,输出list容器中的元素:" << endl; print(lt); return 0; }运行结果:
输出list容器中的元素:
1 2 3 4 5 6 7 8 9 10
再次输出list容器中的元素:
5 1 2 3 4 5 6 7 8 9
删除5之后,输出list容器中的元素:
1 2 3 4 6 7 8 9
- 第 4~11 行代码定义了一个函数模板 print() 用于输出 list 容器中的元素。print() 函数模板的参数为 list 容器,在函数模板内部,创建 list 的 iterator 迭代器,通过迭代器遍历容器元素并输出;
- 第 14~16 行代码创建 list 容器 lt,并在 for 循环中调用 push_back() 函数从尾部插入元素;
- 第 18 行代码调用 print() 函数输出容器 lt 中的元素;
- 第 19 行代码调用 pop_back() 函数删除容器 lt 尾部元素 10;
- 第 20 行代码调用 push_front() 函数将元素 5 插入容器 lt 的头部;
- 第 22 行代码再次调用 print() 函数输出容器 lt 中的元素;
- 第 23 行代码调用 remove() 函数删除元素 5;
- 第 25 行代码调用 print() 函数输出容器 lt 中的元素。
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。