set、map容器
Hey,兄弟姐妹们!想不想了解C++中的set和map容器到底是个啥?让我用轻松的方式为你解读✨。
首先,set和map都是C++中非常有用的容器。set就像一个自动排好序的朋友圈动态,所有元素都会按顺序排列,而且set不允许有重复的内容,而multiset则像一个允许重复点赞的动态。比如,你想存储一些成绩,set会自动帮你从小到大排列,多方便呀!🙋
而map就像一本超级智能的电话簿,每个名字都有对应的电话号码。键值对让你可以轻松查找特定的信息,是不是很酷?而且,map不允许重复的键值,这样就不会出现重复的电话号码啦!📱
你知道吗,set和map的底层其实用的是二叉树结构!就像一棵树,每个节点都连着左右孩子,这样查找起来特别快,简直就是数据查询的小能手!🌳
最厉害的是,他们还能自定义排序规则。比如说,你可以让set按照降序排列,或者让map根据自己的需求排序数据。这简直就是为开发者量身定制的神器!💪
不过,刚开始用的时候可能有点摸不着头脑,不过熟能生巧,多练习自然就手到擒来了。对了,你知道set和map在实际开发中有哪些应用场景吗?比如,管理系统中的数据排序、存储用户信息等等,都是它们大显身手的地方!🤔
总之,set和map就像是编程世界里的瑞士军刀,掌握了它们,你的编码之路会顺畅不少!🚀
一、set
1. set基本概念
简介:
所有元素都会在插入时自动被排序
本质:
set/multiset属于关联式容器,底层结构是用二叉树实现。
set和multiset区别:
set不允许容器中有重复的元素
multiset允许容器中有重复的元素
2. set构造和赋值
构造:
set<T> st; //默认构造函数:
set(const set &st); //拷贝构造函教
赋值:
set& operator=(onst set &st); //重载等号操作符
//打印
void PrintSet(const set<int>& s) {
for (set<int>::const_iterator it = s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test494533()
{
set<int> s1;
//插入数据只有insert方式
// set容器特点:所有元素插入时候自动被排序
// set容器不允许插入重复值
s1.insert(123);
s1.insert(25);
s1.insert(33);
s1.insert(63);
//打印
PrintSet(s1);
//拷贝构造
set<int> s2(s1);
PrintSet(s2);
set<int> s3;
s3 = s2;
PrintSet(s3);
}
3. set大小和交换
函数原型:
size(); //返回容器中元素的数目
empty(); //判断容器是否为空
swap(st); //交换两个集合容器
4. set插入和删除
函数原型:
insert(elem); //在容器中插入元素。
clear(); //清除所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg,end); //删除区间[beg,end)的所有元素,返回下一个元素的迭代器。
erase(elem); //删除容器中值为elem的元素。
5. set查找和统计
函数原型:
find(key); //查找key是否存在,若存在,返回该键的元素的迭代器; 若不存在,返回set.end();
count( key); //统计key的元素个数 0 1
6.set和multiset区别
区别:
set不可以插入重复数据,而multiset可以
set插入数据的同时会返回插入结果,表示插入是否成功.
multiset不会检测数据,因此可以插入重复数据
7.pair对组创建
功能描述:
成对出现的数据,利用对组可以返回两个薮据
两种创建方式:
pair<type, type> p ( value1, value2 );
pair<type, type> p -=make_pair( value1, value2 );
//第一种
pair<string, int>p("tom", 36);
cout << "姓名:" << p.first << "年龄:" << p.second;
//第二种
pair<string, int> p2 = make_pair("jerry", 95);
cout << "姓名:" << p2.first << "年龄:" << p2.second;
8. set容器排序
set容器默认排承规则为从小到大
利用仿函数。可以改变排序规则
内置排序指定规则
class myCompare
{
public:
//重载()
bool operator()(int v1, int v2) const
{
return v1 > v2;
}
};
void test49789()
{
//指定排序规则
set<int, myCompare> s2;
s2.insert(1235);
s2.insert(255);
s2.insert(343);
s2.insert(678);
//遍历
for (set<int, myCompare>::iterator it = s2.begin(); it != s2.end(); it++)
{
cout << " " << *it;
}
cout << endl;
}
自定义数据类型排序
class Person
{
public:
string m_Name;
int m_Age;
int m_Height;
Person(string name, int age, int height)
{
this->m_Age = age;
this->m_Height = height;
this->m_Name = name;
}
};
class ComparePersonHH
{
public:
//重载()
bool operator()(const Person &p1,const Person &p2) const
{
//按照年龄降序
return p1.m_Age > p2.m_Age;
}
};
void test0145()
{
//自定义数据类型都会指定排序规则
set<Person, ComparePersonHH> s;
//准备数据
Person p1("hey", 25, 175);
Person p2("kiring", 35, 195);
Person p3("iron man", 45, 180);
Person p4("spide man", 25, 168);
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
for (set<Person, ComparePersonHH>::iterator it = s.begin(); it != s.end(); it++)
{
cout << " 姓名:" << (*it).m_Name << " 身高:" << (*it).m_Height << " 年龄:" << (*it).m_Age << endl;
}
}
二、map
1.基本概念
简介:
map中所有元素都是pair
pair中第一个元素为key(键值),起到索引作用,第二个元素为value (实值)
所有元素都会根据元素的键值自动排序
本质:
map/multimap属于关联式容器。底层结构是用二叉树实现。
优点:
可以根据key值快速找到value值
map和multimap区别:
map不允许容器中有重复key值元素
multimap允许容器中有重复key值元素
2.构造函数
函数原型:
构造;
map<T1,T2> mp; //map默认构造函数:
map( const map &mp); //拷贝构造函数
赋值:
map& operator=(onst map &mp); //重载等号操作符
void printMap(map<int, int>& m)
{
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
cout << " key:" << (*it).first << " value = " << it->second << endl;
}
cout << endl;
}
void test430()
{
//创建map容器
map<int, int> m;
m.insert(pair<int, int>(1, 23));
m.insert(pair<int, int>(3, 26));
m.insert(pair<int, int>(4, 87));
m.insert(pair<int, int>(5, 69));
printMap(m);
//拷贝构造
map<int, int> m2(m);
printMap(m2);
//赋值
map<int, int>m3;
m3 = m2;
printMap(m3);
3. map大小和交换
函数原型:
size(); //返回容器中元素的数目
empty(); //判断容器是否为空
swap(st); //交换两个集合容器
4. map插入和删除
函数原型:
insert(elem); //在容器中插入元素。
[ ]不建议插入,用途可以利用key访问到value
clear(); //清除所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg