list容器
基本概念
- list容器即为链表,是一种物理存储单元(地址)并不连续的容器
- 链表是通过一系列的节点组成的,每个包括数据域与指针域。数据域储存节点的数据,指针域储存指向下一个节点的指针(如果是双向链表还会储存指向上一个节点的指针)
- STL中的链表是一个双向循环链表
list容器的迭代器为双向迭代器,仅支持顺序访问;不能像vector的迭代器一样进行随机访问
但相比于vector容器,插入或者删除操作都不会造成原有list迭代器失效(因为list容器的地址空间是连续的,插入或者删除元素之后会重新分配空间从而导致原有的内存空间失效)
list容器构造函数
//默认构造函数
list<T> lst;
//拷贝构造函数,将另一个链表在[beg, end)区间中的元素拷贝给自身
list(beg, end);
//拷贝构造函数,拷贝n个elem元素给自身
list(n, elem);
//拷贝构造函数,完整的复制另一个链表
list(const list&lst)
赋值与交换
//将区间另一个链表[beg, end)范围内的元素赋值给自身
assign(beg, end);
//将n个elem赋值给容器
assign(n, elem);
//重载的等号操作符,可以直接通过等号赋值
list& operator=(const list &lst);
//与另一个容器交换元素
swap(const list& lst);
assing函数适用于给一个空的链表赋值,如果是一个已经初始化过的链表assign函数和重载的等号都会清空原有数据之后再赋值;
大小操作
//返回容器中的元素个数
size();
//判断容器是否为空
empty();
//重新指定容器的长度为num,若容器变长则以默认值(指定值elem)填充新位置
//若容器变短则从后面删除多出来的元素
resize(num);
resize(num, elem);
插入和删除
//头插 尾插
void push_back(elem);
void pop_back();
void push_front(elem);
void pop_front();
//在指定位置pos插入一个元素elem,返回插入元素的迭代器
iterator insert(iterator pos, elem);
//在指定位置插入n个elem元素
void insert(iterator pos, int n, elem);
//在pos位置插入另一个容器在beg和end(左闭右开)之间的数据
void insert(iterator pos, InputIt beg, InputIt end);
//清除容器中的所有元素
void clear();
//删除容器在beg和end之间的元素(左闭右开),返回下一个元素的迭代器
iterator erase(InputIt beg, InputIt end);
//删除指定位置pos的元素,返回下一个元素的迭代器
iterator erase(pos);
//清除容器中所有与elem值匹配的元素
void remove(elem);
- InputIt 并不是特定的数据类型,它是输入迭代器的模板参数占位符
数据存取
//返回第一个元素
T front();
//返回最后一个元素
T back();
链表不能通过 [ ] 或者at函数访问数据,因为链表的内存空间是不连续的它的迭代器只支持双向访问,不支持随机访问
//链表的迭代器只支持双向访问,不支持随机访问
list<int> lst(10, 100);
list<int>::iterator it;
//双向访问:
it++;
it--;
//随机访问(不支持)
it = it + 1;
反转和排序
//反转链表
reverse();
//将链表中的元素排序
sort();
这里的sort函数是list容器内置的成员函数而不是STL库中的全局函数 因为所有不支持随机访问迭代器的容器都不能用标准算法,所以在容器内部会自带这些函数
这里的排序函数是默认升序的,如果需要降序则需要我们自己定义一个函数
bool myCompare(int v1, int v2)
{return v1 > v2;
}
list<int> lst;
//初始话过程略去
lst.sort(myCompare);
此时sort函数作降序排序
另外 自定义数据类型也可以通过sort函数排序,但是也需要我们自定义一个函数提供使用