set 基本概念简介:所有元素都会在插入时自动被排序本质:set/multiset 属于 关联式容器 ,底层结构是用 二叉树 实现。set 和 multiset 区别 :set 不允许容器中有重复的元素multiset 允许容器中有重复的元素
map 基本概念简介:map 中所有元素都是 pairpair 中第一个元素为 key (键值),起到索引作用,第二个元素为 value (实值)所有元素都会根据元素的键值自动排序本质:map/multimap 属于 关联式容器 ,底层结构是用 二叉树 实现。优点:可以根据 key 值快速找到 value 值map 和 multimap 区别 :map 不允许容器中有重复 key 值元素multimap 允许容器中有重复 key 值元素
构造:setst ; // 默认构造函数:set(const set &st) ; // 拷贝构造函数赋值:set& operator=(const set &st) ; // 重载等号操作符
构造:mapmp ; //map 默认构造函数 :map(const map &mp) ; // 拷贝构造函数赋值:map& operator=(const map &mp) ; // 重载等号操作符
代码实现
set
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
//set/multiset属于关联式容器 底层结构是用二叉树
//set和multise区别
// 1.set不允许容器中有重复的元素
// 2.multiset允许容器有重复的元素
void printSet(set&S){
for(set::iterator it=S.begin();it!=S.end();it++){
cout<<*it<<" ";
}
cout< s1;
//set插入数据时只有insert方式
s1.insert(10);
// s1.insert(40);添加的
s1.insert(20);
s1.insert(30);
s1.insert(40);
//遍历容器
//set容器特点:1所有元素插入时候自动被排序
//2set容器不允许插入重复值
printSet(s1);
//拷贝构造
set s2(s1);
printSet(s2);
//赋值
set s3;
s3=s2;
printSet(s3);
}
int main()
{
test01();
system("pause");
}
map
//map中所有元素都是pair
//pair第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
//所有的元素都会根据元素的键值自动排序
//本质: map/multimap属于关联式容器,底层结构是用二叉树实现
//优点:可根据key值快速找到value值
//map不允许容器中有重复key值元素
//multimap允许容器中有重复key值元素
#include
#include
#include
#include
#include
#include
#include
#include
#include
size() ; // 返回容器中元素的数目empty() ; // 判断容器是否为空swap(st) ; // 交换两个集合容器
set
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
//没提供resize(),怕有数值重复
void printSet(set &s){
for(set::iterator it=s.begin();it!=s.end();it++){
cout<<*it<<" ";
}
cout< s1;
//插入数据
s1.insert(10);
s1.insert(20);
s1.insert(40);
s1.insert(30);
//打印容器
printSet(s1);
//判断是否为空
if(s1.empty()){
cout<<"s1为空"< s1;
//插入数据
s1.insert(10);
s1.insert(20);
s1.insert(40);
s1.insert(30);
set s2;
//插入数据
s2.insert(100);
s2.insert(200);
s2.insert(400);
s2.insert(300);
cout<<"交换前"<
map
#include
功能描述:t 容器进行插入数据和删除数据函数原型:insert(elem) ; // 在容器中插入元素。clear() ; // 清除所有元素erase(pos) ; // 删除 pos 迭代器所指的元素,返回下一个元素的迭代器。erase(beg, end) ; // 删除区间 [beg,end) 的所有元素 ,返回下一个元素的迭代器。erase(key) ; // 删除容器中值为 key 的元素
set
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
void printSet(set &s){
for(set::iterator it=s.begin();it!=s.end();it++){
cout<<*it<<" ";
}
cout<s1;
//插入
s1.insert(10);
s1.insert(20);
s1.insert(40);
s1.insert(30);
// s1.insert(2,90);//想在第二位插29,报错
//遍历
printSet(s1);
//删除
// s1.erase(s1.begin());
//删除的是排序后的首位
//删除重载版本
s1.erase(30);//直接把30删除了 和list remove一样
printSet(s1);
//清空
s1.erase(s1.begin(),s1.end());
printSet(s1);
s1.clear();
}
int main()
{
test01();
system("pause");
}
map
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
void printMap(map&m){
for(map::iterator it=m.begin();it!=m.end();it++){
cout<<"key值="<<(*it).first<<"value="<second<m;
//插入
//第一种
m.insert(pair(1,10));
//第二种
m.insert(make_pair(2,20));
//第三种
m.insert(map::value_type(3,30));
//第四种 不建议用,用途 可以利用key访问到value
m[4]=40;
/*例如*/ cout<
功能描述:对 map 容器进行查找数据以及统计数据函数原型:find(key) ; // 查找 key 是否存在 , 若存在,返回该键的元素的迭代器;若不存在,返回 set.end();count(key) ; // 统计 key 的元素个数
set
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
void test01(){
set s1;
//插入数据
s1.insert(10);
s1.insert(20);
s1.insert(40);
s1.insert(30);
set::iterator pos=s1.find(30);//find找到返回it的那个数值,没找到返回it.end()
if(pos!=s1.end()){
cout<<"找到元素"<<*pos< s1;
s1.insert(10);
s1.insert(20);
s1.insert(40);
s1.insert(30);
//统计30的个数
int num=s1.count(30);
cout<<"num="<
map
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
void test01()
{
mapm;
m.insert(pair(1, 10));
m.insert(pair(2, 20));
m.insert(pair(3, 30));
//查找
map::iterator pos = m.find(3);
if (pos != m.end())
{
cout << "找到了元素 key = " << (*pos).first << " value = " << (*pos).second << endl;
}
else
{
cout << "未找到元素" << endl;
}
//统计
int num = m.count(3);
cout << "num = " << num << endl;//map只有1
}
int main()
{
test01();
system("pause");
}
默认 从小到大排序,掌握如何改变排序规则主要技术点 :利用仿函数,可以改变排序规则
set
#include
#include
#include
#include
#include
#include
#include
#include
//set内置类型指定排序规则
using namespace std;
//仿函数
class MyCompare{
public:
bool operator()(int v1,int v2)//第一个小括号表示重载符号,第二个小括号表示函数的参数列表
{
return v1>v2;//降序排列
}
};
void test01(){
set s1;
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< s2;//按照仿函数类型插入
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<
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
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)//这里加不加&都可,值传递或者引用传递
{
//按照年龄进行排序 降序
return p1.m_Age > p2.m_Age;
}
};
void test01(){
//自定义数据类型 都会指定排序规则
set s;
Person p1("刘备", 23);
Person p2("关羽", 28);
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");
}
map
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
//仿函数
class MyCompare{//仿函数使其从大到小排序
public:
bool operator()(int v1,int v2){
//降序
return v1>v2;
}
};
void test01(){
mapm;//改变排序顺序,要从这一步入手
//然后就是逆序输出
m.insert(make_pair(1,10));
m.insert(make_pair(3,30));
m.insert(make_pair(2,20));
m.insert(make_pair(4,40));//默认用key排序
for(map::iterator it=m.begin();it!=m.end();it++){
cout<<"key值="<<(*it).first<<"value="<second<
set 不可以插入重复数据,而 multiset 可以set 插入数据的同时会返回插入结果,表示插入是否成功multiset 不会检测数据,因此可以插入重复数据map 和 multimap 区别 :map 不允许容器中有重复 key 值元素multimap 允许容器中有重复 key 值元素
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
void test01(){
sets;
pair::iterator,bool> ret= s.insert(10);
if(ret.second){
cout<<"第一次插入成功"<ms;
//允许插入重复的值
ms.insert(10);
ms.insert(10);
for(multiset::iterator it=ms.begin();it!=ms.end();it++){
cout<<*it<<" ";//10 10 说明允许重复
}
cout<
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
//成队出现的数据,利用对组可以返回两个数据
void test01(){
//第一种创建
pairp("Tom",20);
cout<<"姓名"<p2=make_pair("jerry",30);
cout<<"姓名"<