set容器及multiset容器

简介: 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;
}


运行结果:



相关文章
|
存储 编译器 容器
set、map、multiset、multimap的介绍及使用以及区别,注意事项
set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列。set当中存储元素的value都是唯一的,不可以重复,因此可以使用set进行去重。set默认是升序的,但是其内部默认不是按照大于比较,而是按照小于比较。set中的元素不能被修改,因为set在底层是用二叉搜索树来实现的,若是对二叉搜索树当中某个结点的值进行了修改,那么这棵树将不再是二叉搜索树。
442 0
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
709 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容器编排
521 3
|
存储 算法 NoSQL
C++一分钟之-map与set容器详解
【6月更文挑战第21天】C++ STL的`map`和`set`是基于红黑树的关联容器,提供有序存储和高效查找。`map`存储键值对,键唯一,值可重复;`set`仅存储唯一键。两者操作时间复杂度为O(log n)。常见问题包括键的唯一性和迭代器稳定性。自定义比较函数可用于定制排序规则,内存管理需注意适时释放。理解和善用这些工具能提升代码效率。
382 3
|
C++ 容器
C++之set/multiset容器
C++之set/multiset容器
191 1
|
存储 自然语言处理 C++
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
191 0
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
|
存储 C语言 容器
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(下)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
547 1
|
存储 C语言 容器
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(中)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
401 1
|
存储 自然语言处理 C语言
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(上)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
391 1