目录
一、list容器
1.基本概念
list将数据进行链式存储。链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。
链表的组成:链表由一系列结点组成。结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
list优点:采用动态存储分配,不会造成内存浪费和溢出;可以对任意位置进行插入删除元素。缺点:容器遍历速度没有数组快,占用空间比数组大。
STL中的链表是一个双向循环链表。 由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器。
list有一个重要的性质,插入操作和删除操作不会造成原有list迭代器的失效,这在vector是不成立的。
STL中List和vector是两个最常被使用的容器,各有优缺点
2.构造函数
list构造方式同其他几个STL常用容器,熟练掌握即可。
3.赋值和交换
list赋值和交换操作能够灵活运用即可。
4. 大小操作
5.插入和删除
6.数据存取
list不能使用[]或at访问容器中的元素。原因是list本质是链表,不是用连续线性空间存储数据,迭代器也是不支持随机访问的。
7.反转和排序
对于自定义数据类型,必须要指定排序规则,否则编译器不知道如何进行排序。
将Person自定义数据类型进行排序,Person有姓名、年龄、身高这三个属性。
8.士兵队列训练问题
#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
int n,nums;
void solve(list<int> &l,int key){
int i=0;
list<int>::iterator it=l.begin();
while(it!=l.end()){//报完数以后才判断size是否小于3,而不是士兵小于3人以后立刻停止报数
i++;
if((i%key==0)){it=l.erase(it);}
else{it++;}
}
}
int main()
{
while(cin>>n){
for(int i=0;i<n;i++){
cin>>nums;
list<int> l;
for(int i=1;i<=nums;i++)
l.push_back(i);
while(l.size()>3){
solve(