set介绍以及使用(c++)

本文介绍了C++中的set容器,它是一个按照特定排序准则存储唯一元素的容器。set内部基于红黑树实现,提供了高效的查找和迭代操作。文章详细讲解了set的构造、迭代器、容量操作以及插入、删除等元素操作,并给出了使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

set简介

  1. set是按照一定次序存储元素的容器
  2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素 不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
  3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
  4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
  5. set在底层是用二叉搜索树(红黑树)实现的。

set的使用

1.set的构造
set (const Compare& comp = Compare(), const Allocator& = Allocator() );------------------------构造空的set
set (InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& = Allocator() );-------------------用[first, last)区间 中的元素构造set
set ( const set<Key,Compare,Allocator>& x); ------------set的拷贝构造

2.set的迭代器
iterator begin() ------------返回set中起始位置元素的迭代器
iterator end() ---------------返回set中最后一个元素后面的迭代器
const_iterator cbegin() const ----------返回set中起始位置元素的const迭代器
const_iterator cend() const ----------返回set中最后一个元素后面的const迭代器
reverse_iterator rbegin() ----------返回set第一个元素的反向迭代器,即end
reverse_iterator rend()----------返回set最后一个元素下一个位置的反向迭代器,即 rbegin
const_reverse_iterator crbegin() const----------返回set第一个元素的反向const迭代器,即cend
const_reverse_iterator crend() const----------返回set最后一个元素下一个位置的反向const迭代器,即crbegin
3.set的容量
bool empty ( ) const ------检测set是否为空,空返回true,否则返回true
size_type size() const -------返回set中有效元素的个数
4.set的修改

pair<iterator,bool> insert ( const value_type& x )---------------在set中插入元素x,实际插入的是<x, x>构成的键值对, 如果插入成功,返回<该元素在set中的位置,true>,如果 插入失败,说明x在set中已经存在,返回<x在set中的位 置,false>
void erase ( iterator position )-------- 删除set中position位置上的元素
size_type erase ( const key_type& x )--------删除set中值为x的元素,返回删除的元素的个数
void erase ( iterator first, iterator last )--------删除set中[first, last)区间中的元素
void swap ( set<Key,Compare,Allocator>& st );--------交换set中的元素
void clear ( ) --------将set中的元素清空
iterator find ( const key_type& x ) const--------返回set中值为x的元素的位置
size_type count ( const key_type& x ) const--------返回set中值为x的元素的个数

set使用举例

#include<set>
#include<iostream>
#include<functional>
using namespace std;
void test()
{
	set<int> s;//空的set对象s
	int array[] = {0,1,2,3,4};
	set<int,greater<int>>> s1(array,array+5);//通过array数组构建s2,这里用到greater<int>及由大到小顺序排列
	set<int> s2(array,array+5);
	set<int, greater<int>> copy(s1);//set的拷贝构造
	set<int, greater<int>>::iterator it = s1.begin();//使用set迭代器
	//set元素不能修改
	//遍历有序: 搜索树的中序遍历
	while (it != s1.end())
	{
		cout << *it << " ";
		//*it = 100;//不能修改
		++it;
	}
	cout << endl;
	//set的反向迭代器
	set<int, greater<int>>::reverse_iterator rit = s1.rbegin();
	while (rit != s1.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;
	s2,insert(6)//s2中插入6
	s2.insert(6);//插入会失败,set中不会插入重复的元素
	s2.insert(s2.begin(),15);//在s2.begin()位置插入15,但是实际还是按照大小顺序插入,顺序为0,1,2,3,4,6,15
	int array2[] = { 9, 7, 20, 0 };
	s2.insert(array2, array2 + 4);  //在s2中插入array2的元素,同样也不会有重复并且按照大小顺序插入 
	//删除最左值
	s2.erase(s2.begin());
	auto it = s2.begin();
	auto it2 = ++s2.begin();
	cout << *it << endl;
	cout << *it2 << endl;
	//删除会导致当前位置的迭代器失效, 不影响其他位置的迭代器,失效的迭代器需要重新获取
	s2.erase(it);
	cout << *it2 << endl;
	//set的查找
	set<int>::iterator it = s2.find(3);
	if (it != s2.end())
		cout << *it << endl;
	else
		cout << "未找到" << endl;
	cout<<s2.count(3)<<endl;//打印s2中3出现的次数
}
int main()
{
	test();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值