链表容器:
优点: 可以对任意位置进行快速插入或删除元素
缺点: 容器遍历速度, 没有数组快, 占用空间比数组大\
双向链表: 由于链表的存储方式并不是连续的内存空间, 因此链表list中的迭代器只支持迁移和后移, 属于双向迭代器
list 构造函数
list<T> lst; // list 采用模板实现对象的默认构造形式
list(beg, end); // 构造函数将[beg, end] 区间中的元素拷贝给本身
list(n, elem); // 构造函数将n个elem拷贝给本身
list(const list &list) // 拷贝构造函数
list 赋值交换
assign(beg, end) ; // 将[beg, end] 区间中的数据拷贝赋值给本身
assign(n, elem); // 将n个elem 拷贝赋值给本身
list&operator=(const list &lst); // 重载等号操作符
swap(lst); // 将lst与本身的元素互换
list 大小操作
size() ; // 返回容器中元素个数
empty() ;// 判断容器是否为空
resize(num); // 重新制定容器长度为num, 若容器变长, 则以默认值填充新位置
// 如果容器变短, 则末尾超出容器长度的元素被删除
resize(num, elsem);//重新制定容器长度为num ,若容器变长, 则以elem值填充新位置,
// 如果容器变短, 则末尾超出容器长度的元素被删除
list 插入和删除
push_back(elem); // 在容器尾部加入一个元素
pop_back()// 删除容器中最后一个元素
push_front(elem) // 在容器开头插入一个元素
pop_front()// 在容器开头移除第一个元素
insert(pop, elem) // 在pos位置插入elem元素的拷贝, 返回新数据的位置. pop位置使用的是迭代器
insert(pop, n, elem) // 在pos位置插入n个elem数据, 无返回值
insert(pop, beg, end) // 在pos位置插入[beg, end]区间的数据, 无返回值
clear() // 移除容器的所有数据
erase(beg, end) // 删除[beg, end]区间的数据, 返回下一个数据的位置
erase(pos) // 删除pos位置的数据, 返回下一个数据的位置
remove(elem)// 删除容器中所有与elem值匹配的元素
list 容器数据存储
list 不可以是用[]进行访问数据
以及list 不可以使用at(0) 访问list容器中的元素
原因是list 本质链表, 不是用连续线性空间存储数据, 迭代器也是不支持随机访问的
list<int>::iterator it = L1.begin();
it++;// 支持访问
it--;// 支持访问
it = it + 1; // 不支持随机访问
list 容器反转和排序
reverse() // 反转链表
sort()// 链表排序
// 排序:
sort(l1.begin(), l1.end()); // 所有不支持随机访问迭代器的容器, 不可以用标准算法
l1.sort() // 默认排序规则,从小到大 升序
bool mycompare(int v1, int v2)
{
// 降序 就让第一个数 > 第二个数
return v1 > v2;
}
l1.sort(mycompare); // 降序排序
我们可以更改mycompare即可配置排序规则
bool mycompare(int v1, int v2) // 即可使用很多条件的规则
{
if(规则1)
{
return 1 > 2 //
}
else if(规则2)
{
return 2 > 1 //
}
}