list容器的相关操作

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值