c++ list 详解
c++ list 头文件
简介
list 实际上是双向链表,故亦可称之为 doubly-linked list
性质
双向
链表
双向
双向即给定一个元素,我们能够知道后一个元素和前一个元素
list 的迭代器是双向迭代器
链表
优点:与向量(vectors)相比,它可以快速的插入和删除--插入和删除操作是常数时间的
缺点:随机访问比较慢--元素的访问不是常数时间的,获取元素往往需要在给定一个迭代器的基础上来通过遍历实现
时间复杂度
常数时间 O(1)(与输入数据无关): 基本操作重复执行的次数是一个固定的常数,执行次数不存在变化,通俗的讲就是:无论 n 是什么值运算所花时间都一样
线性时间 O(n)(与输入数据成正比): 基本操作重复执行的次数是与模块 n 成线性相关的,其值会随着模块 n 的变化而变化,当模块 n 的规模确定为定值后,其时间复杂度转化为 O(1)
List
定义和初始化
list<int>lst1; // 创建空 list
list<int>lst2(6); //创建含有 6 个元素的 list
list<int>lst3(3, 2); // 创建含有三个元素的 list
list<int>lst4(lst2); // 使用 ls2 初始化 ls4
list<int>lst5(lst2.begin(), lst2.end()); // 同 ls4
list 常用操作函数
lst1.assign() // 给 list 赋值
lst1.front() // 返回第一个元素
lst1.back() // 返回最后一个元素
lst1.begin() // 返回指向第一个元素的迭代器
lst1.end() // 返回末尾的迭代器
lst1.insert() // 插入一个元素到 list 中
lst1.erase() // 删除一个元素
lst1.pop_back() // 删除最有一个元素
lst1.pop_front() // 删除第一个元素
lst1.clear() // 删除所有元素
lst1.remove(const T & val) // 删除和 val 相等的元素
lst1.push_back() // 在 list 的末尾添加一个元素
lst1.push_front() // 在 list 的首部添加一个元素
lst1.empty() // 判断,若 list 为空返回 true
lst1.max_size() // 返回 list 能容纳的最大元素数量
lst1.sort() // 给 list 排序(顺序)
list.reverse() // 把 list 中的元素倒转
lst1.merge(lst2) // 合并 lst2 到 lst1,并清空 lst2
lst1.unique() // 删除所有和前一个元素相等的元素
void splice(iterator i, list<T> & x, iterator first, iterator last) // 在位置 i 前面插入链表 x 中的区间 [first, last), 并在链表 x 中删除该区间(链表自身和链表 x 可以是用一个链表,只要 i 不在 [first, last) 中即可
list 案例
【实例】用 list 解决约瑟夫问题
约瑟夫问题是:有 n 只猴子,按顺时针方向围成一圈选大王(编号为 1~n),从第 1 号开始报数,一直数到 m,数到 m 的猴子退到圈外,剩下的猴子再接着从 1 开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王。编程求输入 n、m 后,输出最后猴王的编号。
输入数据:每行是用空格分开的两个整数,第一个是 n,第二个是 m(0<m, n<=1 000 000)。最后一行是:0 0
输出要求:对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号。
输入样例:6 212 48 30 0
输出样例:517
程序如下
erase 成员函数返回被删除元素后面那个元素的迭代器,如果被删除的是最后一个元素,则返回 end()
版权声明: 本文为 InfoQ 作者【若尘】的原创文章。
原文链接:【http://xie.infoq.cn/article/b9e3fd65261629cb032a889ec】。文章转载请联系作者。
评论