首页 > 编程笔记 > C++笔记 阅读:10

C++ std::list容器的用法(附带实例)

list 容器以类模板 list<T> 的形式定义在 <list> 头文件中,并位于命名空间 std 中。因此,使用该容器前需先引入 <list> 头文件,并使用 std 命令空间:
#include <list>
using namespace std;

使用 list 容器需要创建 list 对象,创建方法有以下 5 种:
1) 创建空的 list 对象,语法格式如下:
std::list<type> name;
例如,创建一个可容纳 int 型元素的空对象 intlist,代码如下:
std::list <int> intlist;

2) 创建一个大小为 size 的 list 对象,语法格式如下:
std::list<type> name(size);

3) 创建一个大小为 size 的 list 对象,并将各元素值初始化为 value,语法格式如下:
std::list<type> name(size,value);

4) 使用复制构造函数,通过已有的 list 对象创建新的 list 对象,语法格式如下:
std::list<type> name(mylist);

5) 创建元素在指定范围内的链表,first 代表起始位置,last 代表结束位置,语法格式如下:
std::list<type> name(first,last);

list 容器的成员函数见下表:

函数 说明
begin() 返回指向序列第一个元素的迭代器
end() 返回指向序列最后一个元素的迭代器
rbegin() 返回一个反向迭代器,指向序列最后一个元素
rend() 返回一个反向迭代器,指向序列第一个元素
cbegin() 与begin()类似,但增加了const属性,不能修改元素的值
cend() 与end()类似,但增加了const属性,不能修改元素的值
crbegin() 与rbegin()类似,但增加了const属性,不能修改元素的值
crend() 与rend()类似,但增加了const属性,不能修改元素的值
assign() 用新元素替换原有内容
operator=() 复制同类型容器的元素,或者用初始化列表替换现有内容
size() 返回序列的大小(即元素个数)
max_size() 返回 STL 允许的最大容量,一般为 2^32-1,该函数很少用到
resize() 重新设定序列的大小
empty() 判断序列是否为空。如果为空,返回 true;否则返回 false
front() 返回对序列第一个元素的引用
back() 返回对序列最后一个元素的引用
push_back() 在序列末尾添加一个元素
push_front() 在序列起始位置添加一个元素
emplace() 在指定位置生成一个元素
emplace_back() 在序列的末尾生成一个元素
emplace_front() 在序列的起始位置生成一个元素
insert() 在指定位置插入一个或多个元素
pop_back() 移除序列尾部的元素
pop_front() 移除序列头部的元素
reverse() 反转某一段元素
erase() 移除指定位置的一个元素或一段元素
remove() 移除所有和参数匹配的元素
remove_if() 移除满足函数条件的所有元素
unique() 移除所有连续重复的元素
clear() 移除所有的元素,序列大小变为 0
swap() 交换两个序列的所有元素
sort() 对元素进行排序
merge() 合并两个有序序列
splice() 移动指定位置前面的所有元素到另一个同类型的 list 中

【实例】从小到大排序。用 list 和 vector 迭代器将数据排序。具体代码如下:
#include <iostream>
#include <list>
#include <vector>
using namespace std;
int main()
{
    cout << "使用未排序存储 0-9 的数组初始化 list1" << endl;
    int array[10] = {1, 3, 5, 7, 8, 9, 2, 4, 6, 0};
    list<int> list1(array, array+10);
    cout << "list1 调用 sort 方法排序" << endl;
    list1.sort();  // 对元素进行排序
    list<int>::iterator iter = list1.begin();  // 迭代器指向 list1 的第一个元素
    // iter = iter+5  list 的 iter 不支持+运算符
    cout << "通过迭代器访问 list 双向链表中从头开始向后的第 4 个元素" << endl;
    for(int i = 0; i<3; i++)
    {  // 迭代器自增 3 次,指向第 4 个元素
        iter++;
    }
    cout << *iter << endl;
    list1.insert(list1.end(), 13);  // 在序列末尾插入 13
    cout << "在末尾插入数字 13" << endl;
    for(list<int>::iterator it = list1.begin(); it != list1.end(); it++)
    // 输出 list1 各元素的值
    {
        cout << " " << *it;
    }
}
程序运行结果为:

使用未排序存储 0-9 的数组初始化 list1
list1 调用 sort 方法排序
通过迭代器访问 list 双向链表中从头开始向后的第 4 个元素
3
在末尾插入数字 13
0 1 2 3 4 5 6 7 8 9 13

可以看到,迭代器(iterator)和指针的用法很相似,支持自增运算,并可通过“*”访问相应的对象内容。但 list 中的迭代器不支持“+”运算符,而指针与 vector 中的迭代器支持“+”运算符。

相关文章