STL容器set使用说明(set保存自定义数据)

本文详细介绍了C++标准模板库中的Set容器,包括其特点、使用方法及成员函数。Set是一种能够自动排序且不包含重复元素的关联容器,适用于需要有序且唯一元素的场景。

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

c++ stl集合set介绍

   c++ stl集合(Set)是一种包含已排序对象的关联容器。set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。

1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素

2) 不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数

3) 元素比较动作只能用于型别相同的容器(即元素和排序准则必须相同)

先看看程序 
#include <iostream>
#include <set>
#include <string>
using namespace std;

void print(set<int> &s)                            //遍历函数
{
	set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " "; 
		it++;
	}
	cout << endl;
}

void print(set<int, greater<int>> &s)            //倒序遍历
{
	set<int, greater<int>>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " "; 
		it++;
	}
	cout << endl;
}



// set :  红黑树 平衡二叉树
// 内部数据不能重复,值唯一
// set内部数据默认是以从小到大排序的
// set 内部元素是无法修改的
void func1()                                //插入和删除
{
	set<int>  s;
	s.insert(6);
	s.insert(4);
	s.insert(5);
	s.insert(10);
	s.insert(8);
	print(s);

	cout << s.size() << endl;

	cout << "--------------------------" << endl;
	s.erase(s.begin());
	print(s);

	cout << "--------------------------" << endl;
	s.erase(10);   // 通过值直接删除元素
	print(s);
}

// set内部的排序
void func2()                                
{
	// set<int>  s;    set<int, less<int>> s;  <===   默认形式
	set<int,greater<int>>  s;
	s.insert(6);
	s.insert(4);
	s.insert(5);
	s.insert(10);
	s.insert(10);
	s.insert(10);
	s.insert(8);
	print(s);
}

class Student                            //set保存自定义数据(一定要重载<,否则set无法排序)
{
public:
	Student (int id, string name)
	{
		this->id = id;
		this->name = name;
	}
	void print() const
	{
		printf ("id = %d, name = %s\n", id, name.c_str());
	}

	bool operator <(const Student &s) const
	{
		return (id < s.id);
		// return (name < s.name);
	}

	//bool operator >(const Student &s) const
	//{
	//	return (id > s.id);
	//	// return (name < s.name);
	//}
private:
	int id;
	string name;
};


// set 内部需要比较大小 
// 1、运算符重载  <
// 2、写一个函数对象
void func3()
{
	Student s1(10, "小明10");
	Student s2(2, "小明2");
	Student s3(3, "小明3");
	Student s4(7, "小明7");
	Student s5(4, "小明4");
	set<Student> s;
	s.insert(s1);
	s.insert(s2);
	s.insert(s3);
	s.insert(s4);
	s.insert(s5);

	set<Student>::iterator it = s.begin();
	while (it != s.end())
	{
		it->print();
		it++;
	}
}

// set的返回值
void func4()
{
	set<int>  s;
	s.insert(6);
	s.insert(4);
	s.insert(5);
	s.insert(10);
	s.insert(8);
	print(s);

	// pair  对组:两个数
	// 第一个参数:迭代器,指向插入元素的迭代器
	// 第二个元素:判断插入成功与否
	pair<set<int>::iterator, bool> ret = s.insert(10);
	if (ret.second)
		cout << "插入成功,插入的元素:" << *ret.first << endl;
	else
		cout << "插入失败" << endl;


	ret = s.insert(90);
	if (ret.second)
		cout << "插入成功,插入的元素:" << *ret.first << endl;
	else
		cout << "插入失败" << endl;
}


// multiset:内部元素允许重复
void func5()
{
	multiset<int>  s;
	s.insert(6);
	s.insert(4);
	s.insert(5);
	s.insert(10);
	s.insert(4);
	s.insert(4);
	s.insert(4);
	s.insert(4);
	s.insert(8);

	multiset<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

	// 查找:返回值是第一个满足要求的迭代器,没有查找到,返回end()
	it = s.find(15);
	if (it != s.end())
		cout << "找到:" << *it << endl;
	else
		cout <<"没找到" << endl;


	// 返回值:指向第一个大于等于要查找的元素的迭代器
	// it = s.lower_bound(8);
	it = s.lower_bound(7);
	if (it != s.end())
		cout << "找到:" << *it << endl;
	else
		cout <<"没找到" << endl;

	// 返回值:指向第一个大于要查找的元素的迭代器
	it = s.upper_bound(8);
	if (it != s.end())
		cout << "找到:" << *it << endl;
	else
		cout <<"没找到" << endl;

	// equal_range 等价于 lower_bound + upper_bound
	// 返回值 第一个参数  等价于 lower_bound 返回值
	// 返回值 第二个参数  等价于 upper_bound 返回值
	pair<multiset<int>::iterator, multiset<int>::iterator> ret = s.equal_range(4);
	multiset<int>::iterator it1 = ret.first;
	multiset<int>::iterator it2 = ret.second;

	while (it1 != it2)
	{
		cout << *it1 << endl;
		it1++;
	}

}
int main()
{
	func5();
    return 0;
}

set的各成员函数列表如下:

c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器

c++ stl容器set成员函数:clear()--清除所有元素

c++ stl容器set成员函数:count()--返回某个值元素的个数

c++ stl容器set成员函数:empty()--如果集合为空,返回true

c++ stl容器set成员函数:end()--返回指向最后一个元素的迭代器

c++ stl容器set成员函数:equal_range()--返回集合中与给定值相等的上下限的两个迭代器

c++ stl容器set成员函数:erase()--删除集合中的元素

c++ stl容器set成员函数:find()--返回一个指向被查找到元素的迭代器

c++ stl容器set成员函数:get_allocator()--返回集合的分配器

c++ stl容器set成员函数:insert()--在集合中插入元素

c++ stl容器set成员函数:lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器

c++ stl容器set成员函数:key_comp()--返回一个用于元素间值比较的函数

c++ stl容器set成员函数:max_size()--返回集合能容纳的元素的最大限值

c++ stl容器set成员函数:rbegin()--返回指向集合中最后一个元素的反向迭代器

c++ stl容器set成员函数:rend()--返回指向集合中第一个元素的反向迭代器

c++ stl容器set成员函数:size()--集合中元素的数目

c++ stl容器set成员函数:swap()--交换两个集合变量

c++ stl容器set成员函数:upper_bound()--返回大于某个值元素的迭代器

c++ stl容器set成员函数:value_comp()--返回一个用于比较元素间的值的函数

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值