1.stack
栈不能遍历
empty返回是否为空
size返回元素个数
push入栈
pop出栈
2.queue
相当于队列
一端进队一端出队
3.list
链表
迭代器只能前移或后移
resvers() 反转链表
sort()链表排序
list排序案例
按照年龄进行升序,如果年龄相同按照身高进行降序
#include<iostream>
#include<list>
#include<string>
using namespace std;
class Person {
public:
Person(string name, int age, int height) {
P_Name = name;
P_age = age;
P_height = height;
}
string P_Name;
int P_age;
int P_height;
};
bool comparePerson(Person& p1, Person& p2) {
if (p1.P_age == p2.P_age) {
return p1.P_height > p2.P_height;
}
else
return p1.P_age < p2.P_age;
}
void test1() {
list<Person> l1;
Person p1("张三", 20, 180);
Person p2("张A", 30, 170);
Person p3("张B", 45, 150);
Person p4("张C", 30, 140);
Person p5("张D", 34, 160);
Person p6("张E", 15, 190);
Person p7("张F", 30, 185);
l1.push_back(p1);
l1.push_back(p2);
l1.push_back(p3);
l1.push_back(p4);
l1.push_back(p5);
l1.push_back(p6);
l1.push_back(p7);
for (list<Person>::iterator lpbegin = l1.begin(); lpbegin != l1.end(); lpbegin++) {
cout << "姓名:" << (*lpbegin).P_Name << "年龄: " << (*lpbegin).P_age << "身高:" << (*lpbegin).P_height << endl;
}
l1.sort(comparePerson);
cout << " =========================================== " << endl;
for (list<Person>::iterator lpbegin = l1.begin(); lpbegin != l1.end(); lpbegin++) {
cout << "姓名:" << (*lpbegin).P_Name << "年龄: " << (*lpbegin).P_age << "身高:" << (*lpbegin).P_height << endl;
}
}
int main() {
test1();
system("pause");
return 0;
}
sort()中应该为bool类型
bool类型应该return x<y;
4.set/multiset容器
元素插入时会自动排序
set/multiset底层原理是二叉树实现的
区别
set容器中不允许存在相同元素
multiset中可以
#include<iostream>
#include<set>
using namespace std;
void My_Printf_Set(set<int> &s) {
for (set<int>::iterator sbegin = s.begin(); sbegin != s.end(); sbegin++)
cout << (*sbegin) << " ";
cout << endl;
}
void test1() {
set<int> s1;
s1.insert(5);
s1.insert(1);
s1.insert(6);
s1.insert(15);
s1.insert(10);
s1.insert(80);
s1.insert(50);
My_Printf_Set(s1);
}
int main() {
test1();
system("pause");
return 0;
}
find(key)寻找key元素 返回迭代器
count(key)统计key元素的个数
pair<set<int>::iterator, bool> ret = s1.insert(1000);
if (ret.second)
cout << "插入成功" << endl;
pair用于判断插入是否成功 返回bool
改变set排序规则
class My_compare {
public:
bool operator()(int v1, int v2) const{
return v1 > v2;
}
};
set<int,My_compare> s2;
s2.insert(5);
s2.insert(1);
s2.insert(6);
s2.insert(15);
s2.insert(10);
s2.insert(80);
s2.insert(150);
s2.insert(20);
s2.insert(12);
s2.insert(500);
for (set<int, My_compare>::iterator set2begin = s2.begin(); set2begin != s2.end(); set2begin++) {
cout << (*set2begin) << " ";
}
cout << endl;
set自定义类型改变排序规则
自定义数据类型需要指定排序规则 不然会报错
错误 C2676 二进制“<”:“const _Ty”不定义该运算符或到预定义运算符可接收的类型的转换
class My_compare_person{
public:
bool operator()(const Person&p1, const Person&p2)const{
return p1.p_age > p2.p_age;
}
};
set<Person, My_compare_person> s;
Person p1("张三", 30);
Person p2("张a", 15);
Person p3("张b", 43);
Person p4("张c", 32);
Person p5("张d", 17);
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
s.insert(p5);
for (set<Person, My_compare_person>::iterator Personbegin = s.begin(); Personbegin != s.end(); Personbegin++) {
cout << "姓名:" << (*Personbegin).p_name << "年龄:" << (*Personbegin).p_age << endl;
}
对组(pair)的创建
对组返回两个数据
pair<type, type> p(value1, value2);
pair<type, type> p = make_pair(value1, value2);