鱼C论坛

 找回密码
 立即注册
查看: 2406|回复: 0

[学习笔记] 048-C++之STL-->list

[复制链接]
发表于 2018-9-19 20:25:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 moc 于 2018-9-19 20:24 编辑

1、list简介
list是一个双向链表容器,可以高效的进行插入和删除元素。
list不可以随机存取元素,所以不支持at(pos)和[]操作。其迭代器只能++,不能+n.
list的结点是从0开始的,删除元素[0, 3)左闭右开。
46397.png
2、list操作
1. 构造函数
  1. list<int>a{1,2,3}
  2. list<int>a(n)    //声明一个n个元素的列表,每个元素都是0
  3. list<int>a(n, m)  //声明一个n个元素的列表,每个元素都是m
  4. list<int>a(first, last)  //声明一个列表,其元素的初始值来源于由区间所指定的序列中的元素,first和last是迭代器
复制代码

2.基本操作
push_back()    尾部插入元素
push_front()    头部插入元素

pop_back()
     删除尾部一个元素
pop_front()     删除头部一个元素

front()            获取头部一个元素
back()            获取尾部一个元素

swap()           交换两个链表,a.swap(b)和swap(a, b)都可以。
reverse()        逆置链表中的元素

begin()          获取指向头部的迭代器
end()            获取指向尾部后面的迭代器

clear()          清空链表的所有元素
empty()        判断链表是否为空
size()            获取容器中元素的个数

remove(a)     删除容器中所有值为a的元素
erase(pos)            删除pos(迭代器)位置的数据,返回下一个数据的位置
erase(beg,end)           删除[beg,end)区间的数据,返回下一个数据的位置

insert(pos,elem)           在pos位置插elem元素的拷贝,返回新数据的位置
insert(pos,n,elem)        在pos位置插入n个elem数据,无返回值
insert(pos,beg,end)        在pos位置插入[beg,end)区间的数据,无返回值

assign()      (1)a.assign(n, val):将a中的所有元素替换成n个val元素        list<int>b{1,2,3,4,5};     b.assign(5,10);     ==》b中的元素变为10, 10, 10, 10, 10
                 (2)a.assign(b.begin(), b.end())
                        list<int>a{6,7,8,9};
                        list<int>b{1,2,3,4,5};
                        b.assign(a.begin(),a.end());
b中的元素变为6,7,8,9。

resize()
list<int>b{1, 2, 3, 4};
b.resize(2);
list中输出元素:1,2
list<int>b{1, 2, 3, 4};
b.resize(6);
list中输出元素:1,2,3,4,0,0
list<int>b{1, 2, 3, 4};
b.resize(6,9);
list中输出元素:1,2,3,4,9,9

remove_if()
(1)括号中可以传入回调函数
        回调函数的原型为bool isRemove(T &obj1);
        函数名任意,如果obj1需要被移除则返回1,否则返回0
        使用方法:list.remove_if(isRemove)
        这种方法最简单,但是无法向回调函数中传递参数,每一个条件就要有一个回调函数,因此不推荐使用。
  1. bool is_odd(constint& value){
  2.     return (value==4);
  3. }

  4. int main(){
  5.     list<int> a{6,7,4,9,7,10};
  6.     a.remove_if(is_odd);

  7.     list<int>::iterator it = a.begin();
  8.     while(it != a.end()){
  9.         cout<<*it<< " ";
  10.         it++;
  11.     }
  12.     return 0;
  13. }
复制代码

(2)创建用于比较的类,传入类名及初始化参数
        用于比较的类必须重载bool operator()(T &obj1)方法,如果obj1需要被移除则返回1,否则返回0.
        用于比较的类还应当包含必要的构造函数,用于传递参数。
        使用方法:list.remove_if(classname(args))
  1. class single_digit{
  2. public:
  3.     bool operator()(const int& value){
  4.         return (value<10);
  5.     }
  6. };
  7. int main(){
  8.     list<int> a{6,7,4,9,7,10};
  9.    a.remove_if(single_digit());

  10.     list<int>::iterator it = a.begin();
  11.     while(it != a.end()){
  12.         cout<<*it<<" ";
  13.         it++;
  14.     }
  15.     return 0;
  16. }
复制代码



本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-22 10:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表