今天学了stack、deque、list、set这四个容器。
重点是list,虽然list,链表占内存大,或者什么样的,但是在我看来他的功能真的很强大, 他的设计注定他不可以随机访问,但是它可以使用一片不连续的内存地址去存储数据,在我看来要比vector好用多了,起码是在处理数据上,但是存储数据上vector就强大很多,非常节省内存。只能说各有各的好处。
对了,今天的重点是list的排序功能,特别是自定义排序,非常实用且重要。
老实说,今天很不开心,我大概是废物中的废物了吧,没有看清招聘公告的考试资料,就傻等考试,结果等到考试,被一顿爆锤,唯一的希望了,只能去做客服了,天天挨骂去咯,也挺好,还没心情花钱了,不过对于我来说,编程很让人感到快乐, 特别是揣测代码形成过程,很烧脑,但是很有趣,特别是STL的容器设计,有趣极了。非常巧妙。
目录
stack容器
stack 常用接口
queue 容器
queue 常用接口
list容器
转载
list的优点:
list的缺点:
list构造函数
list 赋值和交换
list 大小操作
list 插入和删除
list 数据存取
list 反转和排序
排序案例——重要
set/ multiset 容器
set基本概念
set插入和删除
set查找和统计
set和multiset区别
stack容器
stack 基本概念
概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口
栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为
栈中进入数据称为 --- 入栈 push
栈中弹出数据称为 --- 出栈 pop
感觉是个比较原始的数据结构啊
stack 常用接口
功能描述:栈容器常用的对外接口
构造函数:
-
stack
stk; //stack采用模板类实现, stack对象的默认构造形式 -
stack(const stack &stk); //拷贝构造函数
赋值操作:
-
stack& operator=(const stack &stk); //重载等号操作符
数据存取:
-
push(elem); //向栈顶添加元素
-
pop(); //从栈顶移除第一个元素
-
top(); //返回栈顶元素
大小操作:
-
empty(); //判断堆栈是否为空
-
size(); //返回栈的大小
#include//包含头文件 using namespace std; void test01() { //特点:符合先进先出的数据结构 stack s; s.push(10); s.push(20); s.push(30); s.push(40); s.push(50); //查看大小 cout << "栈的大小: " << s.size() << endl; //出栈:只要栈不为空,查看栈顶,并且执行出栈操作 while (!s.empty()) { //查看栈顶原始 cout << "栈顶元素为:" << s.top() << endl; //出栈 s.pop(); } cout << "栈的大小: " << s.size() << endl; } int main() { test01(); system("pause"); return 0; }
总结:
-
入栈 --- push
-
出栈 --- pop
-
返回栈顶 --- top
-
判断栈是否为空 --- empty
-
返回栈大小 --- size
queue 容器
queue 基本概念
概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口
队列容器允许从一端新增元素,从另一端移除元素
队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为
队列中进数据称为 --- 入队 push
队列中出数据称为 --- 出队 pop
queue 常用接口
描述:栈容器常用的对外接口
构造函数:
-
queue
que; //queue采用模板类实现,queue对象的默认构造形式 -
queue(const queue &que); //拷贝构造函数
赋值操作:
-
queue& operator=(const queue &que); //重载等号操作符
数据存取:
-
push(elem); //往队尾添加元素
-
pop(); //从队头移除第一个元素
-
back(); //返回最后一个元素
-
front(); //返回第一个元素
大小操作:
-
empty(); //判断堆栈是否为空
-
size(); //返回栈的大小
有点奇妙。。不太理解有什么用处。但感觉很奇妙诶
class person
{
public:
person(string name, int age)
{
this->m_name = name;
this->m_age = age;
}
string m_name;
int m_age;
};
void test01()
{
//创建队列 因为是重载的,所以可以使用更多的数据类型
queueq;
//准备数据
person p1("张三", 18);
person p2("李四", 13);
person p3("王五", 25);
person p4("狂徒", 16);
person p5("无法者", 28);
//入队
q.push(p1);
q.push(p2);
q.push(p3);
q.push(p4);
q.push(p5);
//判断只要队列不为空,查看对头,查看对位,出队
while (!q.empty())
{
//查看对头
cout << "队头元素———姓名: " << q.front().m_name << " 年龄: " << q.front().m_age << endl;
//查看队尾
cout << "队尾元素———姓名: " << q.back().m_name << " 年龄: " << q.back().m_age << endl;
//出队
q.pop();
}
cout << "队列大小: " << q.size() << endl;
}
int main() {
test01();
system("pause");
return 0;
}
总结:
-
入队 --- push
-
出队 --- pop
-
返回队头元素 --- front
-
返回队尾元素 --- back
-
判断队是否为空 --- empty
-
返回队列大小 --- size
list容器
list基本概念
功能:将数据进行链式存储
链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
链表的组成:链表由一系列结点组成
结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域
STL中的链表是一个双向循环链表
注意箭头
第一个数据,上面记录数据,下面第一个记录前一个数据的地址(如果前面没有就指向空),下面后一个记录下一个数据的地址(如果后面没有就指向空)
访问一个元素,可以获得这个数据和这个内存地址的前后两个数据的内存地址。
而这样的结构也就使得他可以随意在前后插入的数据。
实现原理,随便在一个数据(假设为B)前或者后插入数据C(这里假设为前),根据这个数据记录的指向前地址的指针域,找到在这个数据前的数据A,改变记录的后地址指针域,改为C所在,然后在改变B记录的前地址指针域,变成C的所在,这样c就查到a和b之间,通过ab可以访问到c,通过c也可以访问到ab
由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器
转载
C++ list用法详解_千寻~的博客-CSDN博客_c++ list 转载 https://blog.csdn.net/yas12345678/article/details/526015781.关于list容器 list是一种序列式容器。list容器完成的功能实际上和数据结构中的双向链表是极其相似的,list中的数据元素是通过链表指针串连成逻辑意义上的线性表,也就是list也具有链表的主要优点,即:在链表的任一位置进行元素的插入、删除操作...https://blog.csdn.net/u011630575/article/details/79734358?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165613701316782425156239%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165613701316782425156239&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-79734358-null-null.142^v21^pc_rank_34,157^v15^new_3&utm_term=list%E8%AF%A6%E8%A7%A3&spm=1018.2226.3001.4187
这位讲的更加透彻
list的优点:
-
采用动态存储分配,不会造成内存浪费和溢出
-
链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
list的缺点:
-
链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大(因为他要连续使用多个指针域找数据,而且占用的地址大,他要存除了数据外(4个),还有两个指针(共8个),)
采用动态存储分配,不会造成内存浪费和溢出
链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
-
链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大(因为他要连续使用多个指针域找数据,而且占用的地址大,他要存除了数据外(4个),还有两个指针(共8个),)
List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。
总结:STL中List和vector是两个最常被使用的容器,各有优缺点
list构造函数
功能描述:
-
创建list容器
函数原型:
-
list
lst; //list采用采用模板类实现,对象的默认构造形式: -
list(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。
-
list(n,elem); //构造函数将n个elem拷贝给本身。
-
list(const list &lst); //拷贝构造函数。
void print_list(const list& L) { for (list ::const_iterator it = L.begin(); it != L.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { //创建list容器 list L1; //添加数据 L1.push_back(10); L1.push_back(20); L1.push_back(30); L1.push_back(40); //遍历数据 cout << "常规遍历" << endl; print_list(L1); //区间方式容器 应该存在某种方式可以直接截取一块区间拷贝进去 cout << "区间方式容器" << endl; list L2(L1.begin(), L1.end()); print_list(L2); //拷贝 cout << "拷贝方式容器" << endl; list L3(L2); print_list(L3); //n个elem cout << "n个elem的方式" << endl; list L4(10, 100); print_list(L4); } int main() { test01(); system("pause"); return 0; }
list 赋值和交换
功能描述:
-
给list容器进行赋值,以及交换list容器
函数原型:
-
assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
-
assign(n, elem); //将n个elem拷贝赋值给本身。
-
list& operator=(const list &lst); //重载等号操作符
-
swap(lst); //将lst与本身的元素互换。
交换
using namespace std; void print_list(const list& L) { for (list ::const_iterator it = L.begin(); it != L.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { //创建list容器 list L1; //添加数据 L1.push_back(10); L1.push_back(20); L1.push_back(30); L1.push_back(40); //遍历数据 cout << "常规遍历" << endl; print_list(L1); list L2; L2 = L1;//operator=的方式,赋值 print_list(L2); list L3;//assign的方式,区间 L3.assign(L2.begin(), L2.end()); print_list(L2); list L4;//assign的方式,n个elem L4.assign(10, 100); print_list(L4); } void test02() { //创建list容器 list L1; //添加数据 L1.push_back(10); L1.push_back(20); L1.push_back(30); L1.push_back(40); list L2(10, 100); cout << "交换前" << endl; print_list(L1); print_list(L2); //交换数据 L1.swap(L2); cout << "交换后" << endl; print_list(L1); print_list(L2); } int main() { test02(); system("pause"); return 0; }
list 大小操作
功能描述:
-
对list容器的大小进行操作
函数原型:
-
size(); //返回容器中元素的个数
-
empty(); //判断容器是否为空
-
resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
//如果容器变短,则末尾超出容器长度的元素被删除。
-
resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
#includevoid printList(const list
& L) { for (list ::const_iterator it = L.begin(); it != L.end(); it++) { cout << *it << " "; } cout << endl; } //大小操作 void test01() { list L1; L1.push_back(10); L1.push_back(20); L1.push_back(30); L1.push_back(40); if (L1.empty()) { cout << "L1为空" << endl; } else { cout << "L1不为空" << endl; cout << "L1的大小为: " << L1.size() << endl; } //重新指定大小 L1.resize(10); printList(L1); L1.resize(2); printList(L1); } int main() { test01(); system("pause"); return 0; }
总结:
-
判断是否为空 --- empty
-
返回元素个数 --- size
-
重新指定个数 --- resize
list 插入和删除
功能描述:
-
对list容器进行数据的插入和删除
函数原型:
-
push_back(elem);//在容器尾部加入一个元素
-
pop_back();//删除容器中最后一个元素
-
push_front(elem);//在容器开头插入一个元素
-
pop_front();//从容器开头移除第一个元素
-
insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。
-
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
-
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
-
clear();//移除容器的所有数据
-
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
-
erase(pos);//删除pos位置的数据,返回下一个数据的位置。
-
remove(elem);//删除容器中所有与elem值匹配的元素。
void print_list(list&L) { for (list ::iterator it = L.begin(); it != L.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { //创建list容器 list L1; //尾插法 L1.push_back(10); L1.push_back(20); L1.push_back(30); L1.push_back(40); //头插法 L1.push_front(4); L1.push_front(3); L1.push_front(2); L1.push_front(1); //打印输出 print_list(L1); //尾删 L1.pop_back(); print_list(L1); //头删 L1.pop_front(); print_list(L1); //insert插入 L1.insert(L1.begin(), 2,1000); print_list(L1); //偏移插入 list ::iterator it = L1.begin(); L1.insert(++it, 200); print_list(L1); //删除 it = L1.begin(); L1.erase(it); print_list(L1); //测试偏移 it = L1.begin(); L1.erase(++it); print_list(L1); //移除 L1.push_back(100000);//注意,remove会删除所有的100000 print_list(L1); L1.remove(100000); print_list(L1); } int main() { test01(); system("pause"); return 0; }
总结:
-
尾插 --- push_back
-
尾删 --- pop_back
-
头插 --- push_front
-
头删 --- pop_front
-
插入 --- insert
-
删除 --- erase
-
移除 --- remove
-
清空 --- clear
list 数据存取
功能描述:
-
对list容器中数据进行存取
函数原型:
-
front(); //返回第一个元素。
-
back(); //返回最后一个元素。
-
list容器中不可以通过[]或者at方式访问数据(这是list的底层设计导致的,是一段不连续的空间存储数据)
-
同时也不支持随机访问,但是deque可以,因为中继器的存在。
#include//数据存取 void test01() { list
L1; L1.push_back(10); L1.push_back(20); L1.push_back(30); L1.push_back(40); //cout << L1.at(0) << endl;//错误 不支持at访问数据 //cout << L1[0] << endl; //错误 不支持[]方式访问数据 cout << "第一个元素为: " << L1.front() << endl; cout << "最后一个元素为: " << L1.back() << endl; //list容器的迭代器是双向迭代器,不支持随机访问 list ::iterator it = L1.begin(); //it = it + 1;//错误,不可以跳跃访问,即使是+1 } int main() { test01(); system("pause"); return 0; }
总结:
-
list容器中不可以通过[]或者at方式访问数据
-
返回第一个元素 --- front
-
返回最后一个元素 --- back
list 反转和排序
功能描述:
-
将容器中的元素反转,以及将容器中的数据进行排序
函数原型:
-
reverse(); //反转链表
-
sort(); //链表排序
同时,他是可以指定排序方法的,
第二不支持随机访问迭代器的,都不能使用标准算法
(标准算法 sort(L1.begin(),L1.end());
void print_list(list& L) { for (list ::iterator it = L.begin(); it != L.end(); it++) { cout << *it << " "; } cout << endl; } bool myCompare(int val1, int val2) { return val1 > val2; } void test01() { //创建list容器 list L1; //尾插法 L1.push_back(10); L1.push_back(100); L1.push_back(32); L1.push_back(42); //反转前 print_list(L1); cout << " 反转前 " << endl; //反转 L1.reverse(); print_list(L1); cout << " 反转后 " << endl; //排序 L1.sort(); print_list(L1); cout << " 排序后 " << endl; L1.sort(myCompare); //指定规则,从大到小 print_list(L1); cout << " 倒叙排序后 " << endl; } int main() { test01(); system("pause"); return 0; }
排序案例——重要
给排序规则单出一个吧
排序规则也是一个个比较去判断,借助stl的模板,对每一个数值进行比较,在进行多元素比较时,就必须指定比较规则。
制定规则多用if,用if来判断各种情况下,应该返回什么样的值,比如谁大谁小,在什么情况下,或,同,等条件。
案例描述:将Person自定义数据类型进行排序,Person中属性有姓名、年龄、身高
排序规则:按照年龄进行升序,如果年龄相同按照身高进行降序
using namespace std;
class person
{
public:
person(string name, int age, int hight)
{
this->m_name = name;
this->m_hight = hight;
this->m_age = age;
}
string m_name;//姓名
int m_age;//年龄
int m_hight;//身高
};
bool compare_person(person &p1,person&p2)
{
if (p1.m_age==p2.m_age)
{
return p1.m_hight > p2.m_hight;
}
else
{
return p1.m_age < p2.m_age;
}
}
void test01()
{
listL;//在这里我没有想到是一个二级嵌套,不是像之前直接l1尾插进去,而是县创建值,在去插入
person p1("刘备", 35, 175);
person p2("曹操", 45, 180);
person p3("孙权", 40, 170);
person p4("赵云", 25, 190);
person p5("张飞", 35, 160);
person p6("关羽", 35, 200);
//向容器中插入数据
L.push_back(p1);
L.push_back(p2);
L.push_back(p3);
L.push_back(p4);
L.push_back(p5);
L.push_back(p6);
//循环打印出来
for (list < person>::iterator it = L.begin(); it != L.end(); it++)
{
cout << "姓名: " << (*it).m_name << " 年龄: " << (*it).m_age << " 身高: " << (*it).m_hight << endl;
}
cout << "---------------------------------" << endl;
cout << "排序后" << endl;
L.sort(compare_person);
for (list < person>::iterator it = L.begin(); it != L.end(); it++)
{
cout << "姓名: " << (*it).m_name << " 年龄: " << (*it).m_age << " 身高: " << (*it).m_hight << endl;
}
}
int main() {
test01();
system("pause");
return 0;
}
set/ multiset 容器
set基本概念
简介:
-
所有元素都会在插入时自动被排序(这又是什么贵物,这么牛皮?)
本质:
-
set/multiset属于关联式容器,底层结构是用二叉树实现。
set和multiset区别:
-
set不允许容器中有重复的元素
-
multiset允许容器中有重复的元素
//set 容器,大小交换 void print_set(set&s) { for (set ::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { set s1; s1.insert(10);//set不支持尾插法 s1.insert(30); s1.insert(40); s1.insert(70); s1.insert(50); s1.insert(20); //打印 print_set(s1); //判断是否为空? if (s1.empty()) { cout << "s1为空" << endl; } else { cout << "s1不为空" << endl; cout << "s1的大小为:" << s1.size() << endl; } set s2; //插入数据 s1.insert(10); s1.insert(106); s1.insert(109); s1.insert(108); s1.insert(110); cout << endl; cout << endl; cout << "交换前:" << endl; cout << "s1的数组为:" << endl; print_set(s1); cout << "s2的数组为:" << endl; print_set(s2); s1.swap(s2); cout << "交换后:" << endl; cout << "s1的数组为:" << endl; print_set(s1); cout << "s2的数组为:" << endl; print_set(s2); } int main() { test01(); system("pause"); return 0; }
总结:
-
set容器插入数据时用insert(因为他不支持尾插法)
-
set容器插入数据的数据会自动排序
set插入和删除
功能描述:
-
set容器进行插入数据和删除数据
函数原型:
-
insert(elem); //在容器中插入元素。
-
clear(); //清除所有元素
-
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
-
erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
-
erase(elem); //删除容器中值为elem的元素。
//set容器 插入和删除 void print_set(set& s) { for (set ::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { set s1; //插入 s1.insert(10); s1.insert(30); s1.insert(20); s1.insert(50); //遍历操作 print_set(s1); //删除操作 s1.erase(s1.begin()); cout << "删除头元素" << endl; print_set(s1); //删除重载版本 s1.erase(30); print_set(s1); //清空 s1.erase(s1.begin(), s1.end()); print_set(s1); } int main() { test01(); system("pause"); return 0; }
总结:
-
插入 --- insert
-
删除 --- erase
-
清空 --- clear
set查找和统计
功能描述:
-
对set容器进行查找数据以及统计数据
函数原型:
-
find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
-
count(key); //统计key的元素个数
void print_set(set&s) { for (set ::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { //查找 set s1; //插入 s1.insert(50); s1.insert(40); s1.insert(20); s1.insert(30); s1.insert(30);//注意我这里放两个30进去,但是打印指出来一个,看来他会缩减? s1.insert(10); print_set(s1); //查找 set ::iterator pos = s1.find(30); if (pos != s1.end()) { cout << "找到数据" << endl; } else { cout << "未找到数据" << endl; } //统计 int num = s1.count(30); cout << "num = " << num << endl; } int main() { test01(); system("pause"); return 0; }
总结:
-
查找 --- find (返回的是迭代器)
-
统计 --- count (对于set,结果为0或者1)//应该能用到其他容器身上
set和multiset区别
学习目标:
-
掌握set和multiset的区别
-
这一章是纯理论的东西,建议记住用法即可。
区别:
-
set不可以插入重复数据,而multiset可以
-
set插入数据的同时会返回插入结果,表示插入是否成功
-
multiset不会检测数据,因此可以插入重复数据
#include//set和multiset区别 void test01() { set s; pair ::iterator, bool> ret = s.insert(10); if (ret.second) { cout << "第一次插入成功!" << endl; } else { cout << "第一次插入失败!" << endl; } ret = s.insert(10); if (ret.second) { cout << "第二次插入成功!" << endl; } else { cout << "第二次插入失败!" << endl; } //multiset multiset ms; ms.insert(10); ms.insert(10); for (multiset ::iterator it = ms.begin(); it != ms.end(); it++) { cout << *it << " "; } cout << endl; } int main() { test01(); system("pause"); return 0; }
总结:
-
如果不允许插入重复数据可以利用set
-
如果需要插入重复数据利用multiset //muiltset甚至和set用一个头文件,
功能描述:
-
成对出现的数据,利用对组可以返回两个数据
两种创建方式:
-
pair
p ( value1, value2 ); -
pair
p = make_pair( value1, value2 );
using namespace std;
void test01()
{
//第一种方式
pairp("tom", 20);
cout << "姓名: " << p.first << " " << " 年龄: " << p.second << endl;
pairp1 = make_pair("jeck", 24);
cout << "姓名: " << p1.first << " " << " 年龄: " << p1.second << endl;
//优点:简单,不需要包含头文件,可以用于修补屎山
}
int main()
{
test01();
system("pause");
return 0;
}
两种方式都可以创建对组,记住一种即可
set容器排序学习目标:
-
set容器默认排序规则为从小到大,掌握如何改变排序规则
主要技术点:
-
利用仿函数,可以改变排序规则
但是在写的时候出现了bug,查询后,加上const解决,疑似内存泄漏
C++错误C3848:具有类型“const MyCompare”的表达式会丢失一些 const-volatile 限定符以调用“bool MyCompare::operator ()(int,int)_just kidding°的博客-CSDN博客在Visual Studio 2019练习C++中map容器时,自定义排序函数//仿函数class MyCompare{public://重载bool operator()(int v1, int v2){return v1 > v2;}};执行map容器实现从大到小排序void test03(){map
class MyCompare
{
public:
bool operator()(int v1, int v2)const
//作者理解应该是Visual Studio的编译器对此做出了更新,要求必须使用const限定。
不然报错,报错原因为错误 C3848 具有类型“const MyCompare”的表达式会丢失一些
//const-volatile 限定符以调用“bool MyCompare::operator ()(int,int)”
//STL_C++ d:softwarevs2017_professionalvctoolsmsvc14.16.27023includexutility 1108
{
return v1 > v2;
}
};
void test01()
{
set s1;
s1.insert(10);
s1.insert(40);
s1.insert(20);
s1.insert(30);
s1.insert(50);
//默认从小到大
for (set::iterator it = s1.begin(); it != s1.end(); it++) {
cout << *it << " ";
}
cout << endl;
//指定排序规则
set s2;
s2.insert(10);
s2.insert(40);
s2.insert(20);
s2.insert(30);
s2.insert(50);
for (set::iterator it = s2.begin(); it != s2.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}
总结:利用仿函数可以指定set容器的排序规则
示例二 set存放自定义数据类型#include#include #include using namespace std; class Person//这里有bug,也是需要用const修饰,但我尝试const修饰后,解决不了,也没查到资料 { public: Person(string name, int age) { this->m_Name = name; this->m_Age = age; } string m_Name; int m_Age; }; class comparePerson { public: bool operator()(const Person& p1, const Person& p2) { //按照年龄进行排序 降序 return p1.m_Age > p2.m_Age; } }; void test01() { set s; Person p1("刘备", 23); Person p2("关羽", 27); Person p3("张飞", 25); Person p4("赵云", 21); s.insert(p1); s.insert(p2); s.insert(p3); s.insert(p4); for (set ::iterator it = s.begin(); it != s.end(); it++) { cout << "姓名: " << it->m_Name << " 年龄: " << it->m_Age << endl; } } int main() { test01(); system("pause"); return 0; }



