c++ set的学习

本文详细介绍了C++中的set数据结构,包括其作为集合的特性(无重复元素),基于红黑树的实现,以及常用的操作如插入、删除、查找、容器大小、迭代器使用和范围查找。
摘要由CSDN通过智能技术生成

一、set的介绍

1.set是集合的意思,集合中不会出现重复的元素。

2.set是基于红黑树实现的,因此它能够高效地进行插入、删除和查找操作。

3.set中的元素默认是按照值的顺序(升序或降序)排列的。

二、set的定义

set<类型>容器名 , 使用set时需带上头文件#include<set>

example:

存储int型的值set<int>s;

存储double型的值set<double>s;

存储char型的值set<char>s;

存储string型的值set<string>s;

存储结构体型的值set<结构体名>s;

三、set的一些基本成员函数

  • insert()                //插入元素
  • size()                   //返回容器的大小
  • erase()                //删除集合中的某个元素
  • clear()                 //清空集合
  • empty()               //判断是否为空
  • begin()                //返回第一个元素的迭代器
  • end()                   //返回最后一个元素的迭代器
  • rbegin()               //反向迭代器
  • rend()                  //反向迭代器
  • find()                   //查找某个指定元素
  • lower_bound()   //返回一个迭代器,指向第一个键值大于x的元素
  • upper_bound()   //返回一个迭代器,指向第一个键值大于x的元素
  • get_allocator()    //返回集合的分配器
  • swap()                 //交换两个集合的变量
  • max_size()          //返回集合能容纳元素的最大极限值

 

 1.插入,遍历

//set定义
	set<int>s;
	//插入元素
	s.insert(1);
	s.insert(1);
	s.insert(3);
	s.insert(5);
	s.insert(5);
	s.insert(2);
	s.insert(4);
	
	//set的遍历 
	set<int> :: iterator it;    //使用迭代器 
	for(it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	}

 运行结果

set是基于红黑树实现的,因此它的元素总是有序的。

set中的元素是唯一的,如果你尝试插入一个已经存在于集合中的元素,它不会被添加,而是保持原有的元素不变。

2.容器的大小,删除元素,清空,判空

    //删除某个元素
	s.erase(2);      //删除元素3
	cout << "删除元素2后的s:" << endl;
	for(it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	 } 
	cout << endl;
	cout << endl; 
	
	//判空
	cout << "判空" << endl; 
	cout << "s.empty = " << s.empty() << endl; 
	cout << endl;
	 
	//清空s
	s.clear();
	cout << "清空后:" << endl;
	cout << "size = " << s.size() << endl; 
	for(it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	} 
	cout << endl;
	
	//判空
	cout << "判空" << endl; 
	cout << "s.empty = " << s.empty() << endl; 

 运行结果

 

判空,如果容器为空,则返回1;如果容器不为空,则返回0。 

 3.查找

//查找某个元素
	for(int i = 0; i < 5; i++)
	{
		s.insert(i);
	} 
	cout << "现有的元素:" << endl; 
	for(it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
	
	cout << "查找元素2:" << endl;
	if(s.find(2) != s.end())
	{
		cout << "找到了" << endl;
	}
	else
	{
		cout << "没找到" << endl; 
	}
	cout << "查找元素5:" << endl;
	if(s.find(5) != s.end())
	{
		cout << "找到了" << endl;
	}
	else
	{
		cout << "没找到" << endl; 
	}
	cout << endl;
	cout << "返回第一个不小于3的数:"; 
	cout << *s.lower_bound(3) << endl;
	cout << "放回第一个大于3的数:";
	cout << *s.upper_bound(3) << endl;
	cout << endl; 

运行结果

find:返回一个迭代器,指向找到的第一个匹配元素。如果找不到匹配的元素,它通常返回一个指向容器末尾(end())的迭代器。在 std::set 中,由于元素唯一,找到的迭代器指向该元素,否则指向 end()

4.反向迭代器

	//反向迭代器,逆序输出 
	set<int>::reverse_iterator t;
	for(t = s.rbegin(); t != s.rend(); t++)
	{
		cout << *t << " ";
	}
	cout << endl;
	

运行结果

 所有代码

#include<iostream>
#include<set>
using namespace std;
int main()
{
	//set定义
	set<int>s;
	//插入元素
	s.insert(1);
	s.insert(1);
	s.insert(3);
	s.insert(5);
	s.insert(5);
	s.insert(2);
	s.insert(4);
	
	//set的遍历 
	cout << "遍历s:" << endl; 
	set<int> :: iterator it;    //使用迭代器 
	for(it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
	cout << endl;
	
	//容器的大小 
	cout << "size = " << s.size() << endl; 
	cout << endl;
	
	//删除某个元素
	s.erase(2);      //删除元素3
	cout << "删除元素2后的s:" << endl;
	for(it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	 } 
	cout << endl;
	cout << endl; 
	
	//判空
	cout << "判空" << endl; 
	cout << "s.empty = " << s.empty() << endl; 
	cout << endl;
	 
	//清空s
	s.clear();
	cout << "清空后:" << endl;
	cout << "size = " << s.size() << endl; 
	for(it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	} 
	cout << endl;
	
	//判空
	cout << "判空" << endl; 
	cout << "s.empty = " << s.empty() << endl; 
	cout << endl;
	
	//查找某个元素
	for(int i = 0; i < 5; i++)
	{
		s.insert(i);
	} 
	cout << "现有的元素:" << endl; 
	for(it = s.begin(); it != s.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
	
	cout << "查找元素2:" << endl;
	if(s.find(2) != s.end())
	{
		cout << "找到了" << endl;
	}
	else
	{
		cout << "没找到" << endl; 
	}
	cout << "查找元素5:" << endl;
	if(s.find(5) != s.end())
	{
		cout << "找到了" << endl;
	}
	else
	{
		cout << "没找到" << endl; 
	}
	cout << endl;
	cout << "返回第一个不小于3的数:"; 
	cout << *s.lower_bound(3) << endl;
	cout << "放回第一个大于3的数:";
	cout << *s.upper_bound(3) << endl;
	cout << endl; 
	
	//反向迭代器,逆序输出 
	set<int>::reverse_iterator t;
	for(t = s.rbegin(); t != s.rend(); t++)
	{
		cout << *t << " ";
	}
	cout << endl;
	
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值