list容器
STL中的链表是双向循环链表
#include<iostream>
#include<list>
using namespace std;
void printlist(const list& l) {//加const限定,只读状态
for (list<int>::const_iterator it = l.begin(); it != l.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
bool myCompare(int v1,int v2) {
//降序 就让第一个数>第二个数
return v1 > v2;
}
int main()
{
list l1; //默认构造
l1.emplace_back(1);//和push_back()作用相同,但是push_back()是
//创建数据之后拷贝到容器中,之后在销毁创建的数据
//emplace_back()则是直接填到容器后面,更加简洁
l1.push_back(1); //填入数据
l1.push_back(2);
l1.push_back(3);
l1.push_back(4);
list<int> l2(l1.begin(), l1.end()); //区间方式构造
list<int> l3(l2);//拷贝构造
l3.pop_back();//尾删
l3.pop_front();//头删
list<int>::iterator it = l3.begin();
l3.insert(++it, 250);//插入操作
l3.insert(it, 2, 34);
it = l3.begin();
l3.erase(it);//删除操作
l3.remove(250);//按值删除
l3.clear();//清空
list<int> l4(10, 5);//n个elem构造
list<int> l5 = l1;//opertor = 赋值
l5.reverse();//反转链表首位对调
l5.sort();//排序,从小到大
//sort(l5.begin(), l5.end());报错 //所有不支持随机访问的容器,不可以使用标准算法
l5.sort(myCompare);//注意没有括号
list<int> l6; //assign赋值
l6.assign(l1.begin(), l1.end());
list<int> l7; //assign赋值
l7.assign(10, 100);
l1.swap(l2); //容器交换
if (l1.empty()) {
cout << "l1容器为空" << endl;
}
else {
cout << "l1容器不为空" << endl;
cout << "l1中的元素个数:" << l1.size() << endl;
}
l3.resize(10);//重新指定大小,比之前大默认用0填充,如果比之前小,会删掉后面的元素
l3.resize(15, 2);//重载函数,比之前大用2填充
cout << l1.front();//访问头元素
cout << l1.back();//访问尾元素
//list本质是链表,不是用连续空间存储数据,不支持随机访问
list<int>::iterator it1 = l1.begin();
it1++;
it1--;
//it = it + 1;it = it + 3;//系统报错不支持随机访问
printlist(l1);
printlist(l2);
printlist(l5);
}
练习:list对于自定义类型进行排序
按照年龄进行升序,如年龄相同按照身高进行降序
#include<iostream>
#include<list>
#include<string>
using namespace std;
class Person {
public:
Person(string name, int age, int height) {
this->name = name;
this->age = age;
this->height = height;
}
string name;
int height;
int age;
};
void printlist(const list& l) {
for (list<Person>::const_iterator it = l.begin(); it != l.end(); it++) {
cout <<"姓名:"<< (*it).name << " " << "年龄:" << (*it).age << " " << "身高:" << (*it).height << " "<<endl;
}
cout << endl;
}
//指定排序规则
bool comparePerson(Person&p1,Person&p2) {
if (p1.age == p2.age) {
//年龄相同按照身高降序
return p1.height > p2.height;
}
else {
return p1.age < p2.age;
}
}
int main()
{
list l1;
Person p1("刘备",35,175);
Person p2("曹操", 45, 180);
Person p3("孙权", 40, 170);
Person p4("赵云", 25, 185);
Person p5("张飞", 35, 183);
Person p6("关羽", 35, 190);
//插入数据
l1.push_back(p1);
l1.push_back(p2);
l1.push_back(p3);
l1.push_back(p4);
l1.push_back(p5);
l1.push_back(p6);
printlist(l1);
cout << "----------------------" << endl;
cout << "排序后:" << endl;
l1.sort(comparePerson);
printlist(l1);
}
输出结果:
姓名:刘备 年龄:35 身高:175
姓名:曹操 年龄:45 身高:180
姓名:孙权 年龄:40 身高:170
姓名:赵云 年龄:25 身高:185
姓名:张飞 年龄:35 身高:183
姓名:关羽 年龄:35 身高:190
排序后:
姓名:赵云 年龄:25 身高:185
姓名:关羽 年龄:35 身高:190
姓名:张飞 年龄:35 身高:183
姓名:刘备 年龄:35 身高:175
姓名:孙权 年龄:40 身高:170
姓名:曹操 年龄:45 身高:180