首页 > 编程笔记

C++ list容器的使用

list 容器以双向链表形式实现,list 容器通过指针将前面的元素和后边的元素链接到一起。

list 容器的存储结构如图 1 所示。

图1 list容器的存储结构
图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 容器也支持迭代器访问元素,提供了iteratorconst_iteratorreverse_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

示例分析:

优秀文章