moc 发表于 2018-9-19 20:25:11

048-C++之STL-->list

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

1、list简介
list是一个双向链表容器,可以高效的进行插入和删除元素。
list不可以随机存取元素,所以不支持at(pos)和[]操作。其迭代器只能++,不能+n.
list的结点是从0开始的,删除元素[0, 3)左闭右开。

2、list操作
1. 构造函数
list<int>a{1,2,3}
list<int>a(n)    //声明一个n个元素的列表,每个元素都是0
list<int>a(n, m)//声明一个n个元素的列表,每个元素都是m
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)
        这种方法最简单,但是无法向回调函数中传递参数,每一个条件就要有一个回调函数,因此不推荐使用。
bool is_odd(constint& value){
    return (value==4);
}

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

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

    list<int>::iterator it = a.begin();
    while(it != a.end()){
      cout<<*it<<" ";
      it++;
    }
    return 0;
}


页: [1]
查看完整版本: 048-C++之STL-->list