set容器及multiset容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: set容器及multiset容器

导航


1.set容器及multiset容器基础知识

2.set交换与大小

3.set容器插入与删除

4.set容器查找与统计

5.set与multiset容器的区别

6.pair对组的创建方式

7.set容器排序(改变排序规则)

———————————————————————————————————


1.set容器及multiset容器基础知识


set与multiset都是关联式容器,所有被插入时都会自动排序


set与multiset容器区别:


1.set不能再容器中有重复的数

2.multiset允许容器中有重复的元素


构造函数:


set< T > st

set(const set& st)


赋值:


operator= //赋值


set例子:


#include 
using namespace std;
#include 
void PrintSet(const set&st)
{
  for(set::const_iterator it = st.begin();it!=st.end();it++)
  {
  cout<<(*it)<<" ";
  }
  cout<
}
void test()
{
  set st;   
  st.insert(20); //插入数据用insert
  st.insert(10);
  st.insert(30);
  st.insert(40);
  st.insert(30);
  PrintSet(st);
  set st1(st); //拷贝构造
  PrintSet(st1);
  set st2;
  st2 = st1;
  PrintSet(st2);
}
int main()
{
  test();
  system("pause");
  return 0;
}



运行结果:



———————————————————————————————————


2.set交换与大小


size() //容量

empty(); //若是容器空为1,不空为0

swap() //交换容器


———————————————————————————————————


3.set容器插入与删除


insert() //插入

clear() //清除

erase(pos) //清除pos迭代器所指元素,返回下一个元素

erase(beg,end) //迭代器指向的区间

erase(elem) //删除容器中为elem的元素


例子:


#include 
using namespace std;
#include 
void PrintSet(const set&st)
{
  for(set::const_iterator it = st.begin();it!=st.end();it++)
  {
  cout<<(*it)<<" ";
  }
  cout<
}
void test()
{
  set st;   
  st.insert(20); //插入数据
  st.insert(10);
  st.insert(30);
  st.insert(40);
  st.insert(30);
  PrintSet(st); //遍历
  //删除第一个数据
  st.erase(st.begin());
  PrintSet(st);   
  //删除重载  直接放入值
  st.erase(30);
  //清空
  //st.erase(st.begin(),st.end());
  st.clear();
  PrintSet(st);
}
int main()
{
  test();
  system("pause");
  return 0;
}



运行结果:



———————————————————————————————————


4.set容器查找与统计


find(key) //找到返回对应元素的迭代器,没有找到返回.end()

cout(key) //set容器中没有重复的数,所以返回0或1


例子:


#include 
using namespace std;
#include 
void test()
{
  set st;   
  st.insert(20); //插入数据
  st.insert(10);
  st.insert(30);
  st.insert(30);
  set::iterator it = st.find(30); //find返回该位置的迭代器,没找到返回st.end()
  if(it != st.end())     //判断是否相同
  {
  cout<<"找到对应的"<<(*it)<
  }
  else
  {
  cout<<"没找到"<
  }
  cout<<"30的数量为:"<
}
int main()
{
  test();
  system("pause");
  return 0;
}



运行程序:



———————————————————————————————————


5.set与multiset容器的区别


set插入数据时会返回插入的结果,结果表示插入是否成功

multiset不会检测数据,因此可以插入重复的数据


检验:


#include 
using namespace std;
#include 
void test()
{
  set st;   
  pair::iterator,bool> ret = st.insert(20); //插入数据
  if(ret.second)
  {
  cout<<"第一次插入成功"<
  }
  else
  {
  cout<<"插入失败"<
  }
  ret = st.insert(20);
  if(ret.second) 
  {
  cout<<"第二次插入成功"<
  }
  else
  {
  cout<<"插入失败"<
  }
}
int main()
{
  test();
  system("pause");
  return 0;
}



运行结果:



———————————————————————————————————


6.pair对组的创建方式


说明:成对成线的数据,利用对组可以返回两个数据


两种创建方式:


pair< type,type>p(value,value)

pair< type,typoe> p = make_pair(value,value)


例子:


#include 
using namespace std;
#include 
#include 
//pair对组的创建
void test()
{
  //第一种方式
  pair p("Tom",20);
  cout<<"姓名:"<
  //第二种
  pairp1 = make_pair("小王",15);
  cout<<"姓名:"<
}
int main()
{
  test();
  system("pause");
  return 0;
}


运行结果:



———————————————————————————————————


7.set容器排序(改变排序规则)


set容器默认插入时从小到大排序,如何改变排序规则?


利用仿函数,可以改变排序规则,必须在插入数之前确定排序方式


例子:


#include 
using namespace std;
#include 
#include 
class Mycompare
{
public:
  bool operator()(int v1,int v2)  //创建一个带有bool类型的仿函数
  {
  return v1>v2;
  }
};
//pair对组的创建
void test()
{
  set p;  //加入自己创建的类
  p.insert(10);
  p.insert(30);
  p.insert(20);
  p.insert(15);
  //遍历
  for(set::iterator it = p.begin();it!=p.end();it++)
  {
  cout<<(*it)<<" ";
  }
  cout<
}
int main()
{
  test();
  system("pause");
  return 0;
}


运行结果:




若插入自定义数据,如何指定排序规则

例子:


#include 
using namespace std;
#include 
#include 
//自定义类
class Person
{
public:
  Person(string name,int age) //构造函数
  {
  this->m_name = name;
  this->m_age = age;
  }
  string m_name;
  int m_age;
};
class Mycompare
{
public:
  bool operator()(const Person& p,const Person& p1)  //创建一个带有bool类型的仿函数
  {
  return p.m_age>p1.m_age;
  }
};
//pair对组的创建
void test()
{
  set st;  //创建容器
  Person p("小明",15);    //自定义数据
  Person p1("小红",14);
  Person p2("小王",16);
  Person p3("小李",20);
  st.insert(p);
  st.insert(p1);
  st.insert(p2);
  st.insert(p3);
  //遍历
  for(set::iterator it = st.begin();it!=st.end();it++)
  {
  cout<<"姓名:"<m_name<<" 年龄:"<m_age<
  }
}
int main()
{
  test();
  system("pause");
  return 0;
}


运行结果:



相关文章
|
3月前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
100 3
|
6月前
|
存储 C++ 容器
|
7月前
|
C++ 容器
C++之set/multiset容器
C++之set/multiset容器
|
7月前
|
存储 自然语言处理 C++
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
52 0
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
|
7月前
|
存储 算法 NoSQL
C++一分钟之-map与set容器详解
【6月更文挑战第21天】C++ STL的`map`和`set`是基于红黑树的关联容器,提供有序存储和高效查找。`map`存储键值对,键唯一,值可重复;`set`仅存储唯一键。两者操作时间复杂度为O(log n)。常见问题包括键的唯一性和迭代器稳定性。自定义比较函数可用于定制排序规则,内存管理需注意适时释放。理解和善用这些工具能提升代码效率。
78 3
|
6月前
|
存储 语音技术 Python
语音识别,函数综合案例,黑马ATM,/t/t一个对不齐,用两个/t,数据容器入门,数据容器可以分为列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)
语音识别,函数综合案例,黑马ATM,/t/t一个对不齐,用两个/t,数据容器入门,数据容器可以分为列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)
|
8月前
|
存储 C语言 容器
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(下)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
52 1
|
8月前
|
存储 C语言 容器
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(中)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
52 1
|
8月前
|
存储 自然语言处理 C语言
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(上)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
66 1
|
7月前
|
编译器 C++ 容器
通过红黑树封装 map 和 set 容器
通过红黑树封装 map 和 set 容器