目录
set容器
一、set的基本概念
二、set构造和赋值
三、set大小和交换
四、set插入和删除
五、set容器查找和统计
六、set和multiset的区别
七、pair对组创建
八、set容器排序
1.学习目标:
2.主要技术点:
3.示例一:set存放内置数据类型
4.示例二:set存放自定义数据类型
map容器
一、map的基本概念
二、map容器大小和交换
三、map容器插入和删除
四、map容器查找和统计
五、map容器排序
1.简介:所有元素都会在插入时自动被排序
2.本质:set/multiset属于关联式容器,底层结构是用二叉树实现
3.set和multiset区别
set不允许容器中有重复元素
multiset允许容器中有重复元素
1.描述:创建set容器以及赋值
2.构造:
3.赋值:
4.示例
set容器插入数据时用insert
set容器插入数据会自动排序
#include
using namespace std;
#include
//set容器构造和赋值
void printSet(sets)
{
for (set::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
sets1;
s1.insert(10);
s1.insert(40);
s1.insert(20);
s1.insert(30);
s1.insert(30);
s1.insert(30);
//遍历容器
//set容器的特点,所有元素被插入的时候会自动排序
//set容器不允许插入重复的值
printSet(s1);
//拷贝构造
set s2(s1);
printSet(s2);
//赋值操作
set s3;
s3 = s2;
printSet(s3);
}
int main()
{
test01();
system("pause");
return 0;
}
1.描述:set容器的大小、是否为空、交换
2.构造:
3.示例:
#include
#include
using namespace std;
//set容器 大小和交换
void printSet(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(40);
printSet(s1);
//判断是否为空
if (s1.empty())
{
cout << "s1为空" << endl;
}
else
{
cout << "s1不为空" << endl;
cout << "s1的元素大小:" << s1.size()<< endl;
}
}
//交换
void test02()
{
set s1;
s1.insert(10);
s1.insert(30);
s1.insert(20);
s1.insert(40);
set s2;
s2.insert(200);
s2.insert(100);
s2.insert(400);
s2.insert(300);
cout << "交换前:" << endl;
printSet(s1);
printSet(s2);
cout << "交换后:" << endl;
s1.swap(s2);
printSet(s1);
printSet(s2);
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}
1.描述:set容器进行插入数据和删除数据
2.构造:
3.示例:
#include
using namespace std;
#include
#include
//set容器的插入和删除
void printSet(set &s)
{
for (set::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
sets1;
//插入
s1.insert(20);
s1.insert(10);
s1.insert(40);
s1.insert(30);
//遍历
printSet(s1);
//删除
s1.erase(s1.begin());
printSet(s1);
//删除重载版本
s1.erase(30);
printSet(s1);
//清空
//s1.erase(s1.begin(),s1.end());
s1.clear();
printSet(s1);
}
int main()
{
test01();
system("pause");
return 0;
}
1.描述:对set容器进行查找数据以及统计数据
2.构造:
3.示例:
#include
#include
using namespace std;
//set容器查找和统计
void test01()
{
//查找
sets1;
//插入数据
s1.insert(30);
s1.insert(20);
s1.insert(10);
s1.insert(40);
set::iterator pos = s1.find(40);
if (pos != s1.end()) //s1.end()指向最后一个元素的下一个位置
{
cout << "找到元素:" << *pos << endl;
}
else
{
cout << "未找到元素" << endl;
}
//对于set而言,统计结果不是0就是1
//对于multiset而言,统计结果大于1
}
//统计
void test02()
{
set s1;
s1.insert(10);
s1.insert(20);
s1.insert(30);
s1.insert(10);
int num = s1.count(100);
cout << "统计nus = " << num << endl;
}
int main()
{
test02();
system("pause");
return 0;
}
注意: count 对于set而言,统计结果不是0就是1;对于multiset而言,统计结果大于1
1.区别:
2.示例:
#include
#include
using namespace std;
//set容器和multiset容器的区别
void test01()
{
set s;
pair::iterator, bool> ret = s.insert(10);
if (ret.second)
{
cout << "第一次插入成功" << endl;
}
else
{
cout << "第一次插入失败" << endl;
}
pair::iterator,bool> ret2 = s.insert(10);
if (ret2.second)
{
cout << "第二次插入成功" << endl;
}
else
{
cout << "第二次插入失败" << endl;
}
multisets1;
//允许插入重复值
s1.insert(20);
s1.insert(20);
for (multiset::iterator it = s1.begin(); it != s1.end(); it++)
{
cout << *it << endl;
}
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
1.功能描述:成对出现的数据,利用对组可以返回两个数组
2.两种创建方式:
3.示例
#include
#include
using namespace std;
//pair对组的创建
void test01()
{
//第一种方式
pair p("Tom", 20);
cout << "姓名:" << p.first << " 年龄:" << p.second << endl;
pair p2 = make_pair("Jerry", 30);
cout << "姓名:" << p2.first << " 年龄:" << p2.second << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
#include
#include
using namespace std;
//set容器排序
class MyCompare
{
public:
bool operator()(int v1, int v2) const
{
return v1 > v2;
}
};
void test01()
{
sets1;
s1.insert(10);
s1.insert(40);
s1.insert(20);
s1.insert(50);
s1.insert(30);
for (set::iterator it = s1.begin(); it != s1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
//指定排序规则为从大到小
sets2;
s2.insert(10);
s2.insert(40);
s2.insert(20);
s2.insert(50);
s2.insert(30);
for (set::iterator it = s2.begin(); it != s2.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
注意仿函数中,operator()重载“()”时需要加const
class MyCompare
{
public:
bool operator()(int v1, int v2) const
{
return v1 > v2;
}
};
没加const报错的原因:通过在 operator()
函数后加上 const
修饰符,你告诉编译器这个函数不会修改对象的状态,因此可以在 const
对象上调用。这样应该能够解决与 C3848
错误相关的问题。
总结:利用仿函数指定set容器的排序规则
#include
#include
#include
using namespace std;
//set容器排序,存放自定义数据类型
class Person
{
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) const
{
//按照年龄降序
return p1.m_Age > p2.m_Age;
}
};
void test01()
{
//自定义的数据类型 都会指定排序规则
set s1;
//创建Person对象
Person p1("刘备", 24);
Person p2("张飞", 14);
Person p3("关羽", 50);
Person p4("Jerry", 28);
Person p5("Tom", 39);
s1.insert(p1);
s1.insert(p2);
s1.insert(p3);
s1.insert(p4);
s1.insert(p5);
for (set::iterator it = s1.begin(); it != s1.end(); it++)
{
cout << "姓名:" << it->m_Name << " 年龄:" << it->m_Age << endl;
}
}
int main()
{
test01();
system("pause");
return 0;
}
1.简介:
2.本质:
3.优点:
4.map/multimap区别
二、map构造和赋值
1.功能描述:对map容器进行构造和赋值操作
2.函数原型:
构造:
赋值:
3.示例:
#include
#include
总结:map中所以元素是成对出现,插入数据时要使用对组
1.功能描述:统计map容器大小以及交换map容器
2.函数原型
3.示例:
#include
#include
1.功能描述:map容器进行插入数据和删除数据‘
2.函数原型:
3.示例:
#include
#include
1.对map容器进行查找数据以及统计数据
2.函数原型
3.示例:
#include
#include
1.学习目标:map容器默认排序规则为 按照key值进行从小到大排序,学习如何改变排序规则
2.技术要点:
3.示例一:内置数据类型排序
#include
#include
3.示例二:自定义数据类型排序
#include
#include
总结:自定义数据类型也只能按照key值排序,不能按照Person的年龄排序。