C++中STL-set详解

目录

 set/ multiset容器

1. set基本概念

2.set构造和赋值

3.set大小和交换

4.set插入和删除

5.set容器-查找和统计

6.set和multiset的区别

7.pair对组创建

8.set容器排序

9.set存放自定义数据类型


set/ multiset容器


1. set基本概念

简介:

所有元素都会在插入时自动被排序


本质:

set/multiset属于关联式容器,底层结构是用二叉树实现。


set和multiset区别:

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

2.set构造和赋值

代码

#include <iostream>
using namespace std;
#include <set>

void printSet(set<int>&s)
{
	for(set<int>::iterator it = s.begin();it != s.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
 } 
void test01()
{
	set<int>s1;
	//插入数据 只有insert方式 
	s1.insert(20);
	s1.insert(10);
	s1.insert(30);
	s1.insert(40);
	
	//遍历容器
	//set容器特:所有元素插入时自动排序
    //set容器不允许插入重复值 
	printSet(s1);
	
	//拷贝构造
	set<int>s2(s1) ;
	printSet(s2);
	
	//赋值
	set<int>s3;
	s3 = s2;
	printSet(s3);	 
 } 
 int main()
{
 	test01();
}

结果

3.set大小和交换

功能描述

统计set容器大小及交换set容器

函数原型

size();                                 //返回容器中元素数目

empty();                             //判断容器是否为空

swap();                              //交换俩个集合容器

代码 

#include <iostream>
using namespace std;
#include <set>

void printSet(set<int>&s)
{
	for(set<int>::iterator it = s.begin();it != s.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
 } 
void test01()
{
	set<int>s1;
	//插入数据 只有insert方式 
	s1.insert(20);
	s1.insert(10);
	s1.insert(30);
	s1.insert(40);
	
	//打印容器 
	printSet(s1);
	
	//判断是否为空
	if(s1.empty())
	{
	   cout<<"s1为空"<<endl; 
	} 
	else {
		cout<<"s1不为空"<<endl; 
		cout<<"s1的大小"<<s1.size() <<endl;
	}

 } 
 //交换
void test02()
{
 	set<int>s1;
 	
 	//插入数据
	s1.insert(10); 
	s1.insert(20); 
	s1.insert(30); 
	s1.insert(40); 
	
	set<int>s2;
 	
 	//插入数据
	s2.insert(100); 
	s2.insert(200); 
	s2.insert(300); 
	s2.insert(400);
	
	cout<<"交换前:"<<endl;
	printSet(s1);
	printSet(s2);
	
	s1.swap(s2);
	cout<<"交换后:"<<endl;

	printSet(s1);
	printSet(s2);
	 
} 
 int main()
{
 	test01();
 	test02();
}


结果

 

4.set插入和删除

功能描述

set容器进行插入数据和删除数据

函数原型

insert (elem);                //在容器中插入元素

clear ( );                       //清除所有元素

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

erase(beg,end);           //删除区间(beg,end)的所有元素,返回下一个元素的迭代器

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

 代码

#include <iostream>
#include <set> 
using namespace std;

//set容器,插入和删除

void printSet(set<int>&s)
{
	for(set<int>::iterator it = s.begin();it != s.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
 } 
void test01()
{
	set<int>s1;
	
	//插入
	s1.insert(30);
	s1.insert(20);
	s1.insert(10);
	s1.insert(40);
	
	//遍历
	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();
} 
 

结果

 

5.set容器-查找和统计

功能描述

对set容器进行查找数据以及统计数据

函数原型

find(key);      //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返set.end();


count(key );   //统计key的元素个数

代码

#include <iostream>
#include <set> 
using namespace std;



void printSet(set<int>&s)
{
	for(set<int>::iterator it = s.begin();it != s.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
 } 
void test01()
{
	//查找 
	set<int>s1;
	
	//插入
	s1.insert(30);
	s1.insert(20);
	s1.insert(10);
	s1.insert(40);
	
	set<int>::iterator pos = s1.find(30);
	
	if(pos != s1.end() )
	{
		cout<< "找到元素:" << *pos <<endl; 
	} 
	else 
	{
		cout<< "未找到元素" <<endl; 
	}
	

	 
}

//统计
void test02()
{
	//查找
	set<int>s1;
	
	//插入数据
	s1.insert(10);
	s1.insert(20);
	s1.insert(30);
	s1.insert(40);
	
	int num = s1.count(30);
	cout<<"num = "<<num<<endl; 
} 
int main()
{
	test01();
	test02();
} 
 

结果

6.set和multiset的区别

学习目标
掌握set和multiset的区别


区别

set不可以插入重复数据,而multiset可以

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

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


7.pair对组创建

功能描述
成对出现的数据,利用对组可以返回两个数据

两种创建方式

pair<type,type> p ( value1, value2 );


pair<type,type> p = make_pair( value1,value2 );

代码

#include <bits/stdc++.h>
using namespace std;

//pair对组创建
void test01()
{
	//第一种方式
	pair<string,int>p("Tom",20);
	
	cout<< "姓名:"<<p.first<<"年龄:"<<p.second << endl;
	
	//第二种方式
	pair<string,int>p2 = make_pair("Jerry",30);
	cout<< "姓名:"<<p2.first<<"年龄:"<<p2.second << endl;
	 
	 
} 
int main()
{
	test01();
} 

结果

 

8.set容器排序

学习目标

set容器默认排序规则为从小到大,掌握如何排序规则

主要技术特点

利用仿函数,可以改变排序规则

代码

#include <iostream>
#include <set>
using namespace std;

class MyCompare
{
  public:
  	bool operator()(int v1,int v2)
	  {
  		 return v1>v2;
	  }
};
// 容器排序
void test01()
{
	set<int>s1;
	
    s1.insert(30);
	s1.insert(20);
	s1.insert(10);
	s1.insert(40);
	s1.insert(50);
	
	for(set<int>::iterator it = s1.begin();it != s1.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
	
	//指定排序规则从大到小
	set<int,MyCompare>s2;
	s2.insert(30);
	s2.insert(20);
	s2.insert(10);
	s2.insert(40);
	s2.insert(50);
	
	for(set<int,MyCompare>::iterator it = s2.begin();it != s2.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
	
	 
} 
int main()
{
	test01();
} 

结果

 

9.set存放自定义数据类型

学习目标:
set容器默认排序规则为从小到大,掌握如何改变排序规则

主要技术点:
利用仿函数,可以改变排序规则

代码

#include <iostream>
#include <string>
#include <set>
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)
	  {
	  	 //按照年龄降序 
  		 return p1.m_Age > p2.m_Age; 
	  }
};
// 容器排序
void test01()
{
	//自定义数据要指定排序规则 
	set<Person,comparePerson>s;
	
	//创建Person对象
	Person p1("刘备",24);
	Person p2("关羽",28);
	Person p3("张飞",25);
	Person p4("赵云",21);
	
	s.insert(p1);
	s.insert(p2);
	s.insert(p3);
	s.insert(p4);
	
	for(set<Person,comparePerson >::iterator it = s.begin();it != s.end();it++)
	{
		cout<<"姓名:"<<it->m_Name << "年龄:"<<it->m_Age <<endl; 
	}
	cout<<endl;
	 
	 
}
int main()
{
	test01();
} 

结果


 

 

  • 54
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 58
    评论
引用提供了一些使用set的常见操作和方法。如果要访问set的最后一个元素,有几种方法可以实现。第一种方法是使用rbegin()函数,它返回一个指向set最后一个元素的反向迭代器,然后可以使用*运算符来获取该元素的值。第二种方法是使用end()函数返回一个指向set末尾的迭代器,然后通过--运算符将迭代器移动到最后一个元素,再使用*运算符获取该元素的值。第三种方法是直接使用end()函数返回的迭代器,然后使用--运算符将迭代器移动到最后一个元素,再使用*运算符获取该元素的值。提供了一个重载<运算符的示例代码。在这个示例,定义了一个结构体node,并在结构体重载了<运算符。通过重载<运算符,我们可以自定义set元素的比较规则。在main函数,创建了一个set<node>类型的集合s,并插入了一些元素。通过遍历集合s,我们可以看到集合的元素按照我们定义的比较规则进行排序。介绍了setlower_bound和upper_bound函数的使用。lower_bound函数返回大于或等于给定值的第一个元素的迭代器,而upper_bound函数返回大于给定值的第一个元素的迭代器。在示例代码,首先创建了一个set<int>类型的集合s,并插入了一些元素。然后使用lower_bound和upper_bound函数分别查找给定值的边界,并输出对应的元素值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++ STLset详解](https://blog.csdn.net/qq_50285142/article/details/122304728)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【c++STL——第八讲】set系列 (常用知识点总结)](https://blog.csdn.net/m0_63233163/article/details/124645182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 58
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫浅子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值