c++ stl set

1.定义

set,就是数学上的集合——即set中的每一个元素只能出现一次,并且set中的元素是已经从小到大排好序的,使用set需要引入头文件#include<set>

2.基本函数

2.1构造函数

  • std::set<int> se:创建一个空的set
  • std::set<int> se{1,2,3,4,5}:创建一个拥有元素1,2,3,4,5的set
  • std::set<int> se1(se):创建一个和se相同的set
  • std::set<int> se2(se1.begin(),se1.end()):创建一个拥有[se1.begin(),se1.end()]之间元素的set

2.2.添加元素

  • se.insert(4):添加一个元素4
  • se.insert(pos,7):在pos处添加元素7,但是最后se中的元素会重新排好序

2.3.删除元素

  • se.erase(5):删除一个元素5
  • se.erase(se.begin(),++se.begin()):删除[begin(),++begin()]之间的元素
  • se.clear():清空set中的所有元素

2.4.set重要的迭代器

  • se.begin():返回正向迭代器的第一个元素
  • se.end():返回正向迭代器的最后一个元素的下一个位置
  • se.rbegin():返回反向迭代器的第一个元素,即vector中的最后一个元素
  • se.rend():返回反向迭代器的最后一个元素的下一个位置,即vector中的第一个元素的前一个位置

2.5.其他函数

  • se.size():set的大小
  • se.empty():判断se的大小
  • se.count(key):查找键key的元素个数
  • se.find(key):如果存在key,返回key所对应的迭代器,否则返回se.end()
  • se.upper_bound(key):返回第一个元素大于key的迭代器
  • se.lower_bound(key):返回最后一个元素小于key的迭代器
  • swap():交换两个set
  • se.emplace()

3.使用实例

3.1.排序

对set的运算符重载使得其可以对非标准类型进行排序

#include<iostream>
#include<set>
#include<string>
struct Infomation
{
	std::string name;
	int score;
	bool operator < (const Infomation &a) const
	{
		return a.score > score;
	}
};
void main(){
	std::set<Infomation> se;
	Infomation info; 
	info.name = "haha";
	info.score = 30;
	se.insert(info);
	info.name = "hahaha";
	info.score = 40;
	se.insert(info);
	info.name = "hahahaha";
	info.score = 60;
	se.insert(info);
	for (auto ll : se)
	{
		std::cout << ll.name << " ";
	}
	std::cout << std::endl;
}

或者选择重载()

#include<iostream>
#include<set>
#include<string>
struct Infomation
{
	std::string name;
	int score;
};
typedef struct{
	bool operator()(const Infomation lhs, const Infomation rhs){
		return lhs.score < rhs.score;
	}
}compare;

void main(){
	std::set<Infomation,compare> se;
	Infomation info;
	info.name = "haha";
	info.score = 30;
	se.insert(info);
	info.name = "hahaha";
	info.score = 40;
	se.insert(info);
	info.name = "hahahaha";
	info.score = 60;
	se.insert(info);
	for (auto ll : se)
	{
		std::cout << ll.name << " ";
	}
}

3.2.添加一个非标准元素

我们除了可以使用insert添加非标准元素,还可以使用emplace和emplace_hint快速添加元素,不同的是两者返回值不同,emplace返回一个迭代器和是否加入成功的pair,而emplace_hint只是返回迭代器。且emplace_hint比emplace多需要一个迭代器参数

#include<iostream>
#include<set>
#include<string>
struct Infomation
{
	std::string name;
	int score;
	Infomation(std::string _name, int _score) : name(_name), score(_score){}
};
typedef struct{
	bool operator()(const Infomation lhs, const Infomation rhs){
		return lhs.score < rhs.score;
	}
}compare;

void main(){
	std::set<Infomation,compare> se;
	se.insert(Infomation("haha",30));
	se.insert(Infomation("hahaha", 40));
	se.insert(Infomation("hahahaha", 60));
	se.emplace("az", 10);
        auto iter=se.emplace_hint(se.begin(),"xx", 20);
	for (auto ll : se)
	{
		std::cout << ll.name << " ";
	}
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用提供了一些使用set的常见操作和方法。如果要访问set中的最后一个元素,有几种方法可以实现。第一种方法是使用rbegin()函数,它返回一个指向set中最后一个元素的反向迭代器,然后可以使用*运算符来获取该元素的值。第二种方法是使用end()函数返回一个指向set末尾的迭代器,然后通过--运算符将迭代器移动到最后一个元素,再使用*运算符获取该元素的值。第三种方法是直接使用end()函数返回的迭代器,然后使用--运算符将迭代器移动到最后一个元素,再使用*运算符获取该元素的值。提供了一个重载<运算符的示例代码。在这个示例中,定义了一个结构体node,并在结构体中重载了<运算符。通过重载<运算符,我们可以自定义set中元素的比较规则。在main函数中,创建了一个set<node>类型的集合s,并插入了一些元素。通过遍历集合s,我们可以看到集合中的元素按照我们定义的比较规则进行排序。介绍了set中lower_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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值