C++ set容器

set/multiset 容器

set基本概念

简介:

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

本质:

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

set和multiset区别:

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

set构造和赋值

功能:
创建set容器以及赋值

构造:

  • set st; //默认构造函数
  • set(const set &st); //拷贝构造函数

赋值:

  • set& operator=(const set &st); // 重载赋值运算符

实例:

#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 _01Test01()
{
	set<int> st;

	//插入数据 只有insert方式
	st.insert(10);
	st.insert(20);
	st.insert(10);
	st.insert(40);
	st.insert(30);
	st.insert(30);

	//set容器特点:
	//1、按顺序插入元素
	//2、不能含有重复元素
	PrintSet(st);
}

void main()
{
	_01Test01();
}

set查找和统计

功能:

  • 对set容器进行查找数据和统计数据

函数原型:

  • find(elem); //查找elem是否存在,若存在则返回该元素的迭代器;若不存在,则返回set.end();
  • count(elem); //统计elem元素的个数 由于set容器中不允许含有重复元素,则值会返回0或者1;

示例:

#include<iostream>
using namespace std;
#include<set>
//set容器 查找和统计
//- find(elem);    //查找elem是否存在,若存在则返回该元素的迭代器;若不存在,则返回set.end();
//-count(elem);    //统计elem元素的个数 由于set容器中不允许含有重复元素,则值会返回0或者1;

//查找
void _04Test01()
{
	set<int> s;
	s.insert(10);
	s.insert(20);
	s.insert(30);
	s.insert(40);

	set<int>::iterator it= s.find(40);
	if (it == s.end())
	{
		cout << "未找到该元素" << endl;
	}
	else
	{
		cout << "找到了该元素" << endl;
	}
}

//统计
void _04Test02()
{
	set<int> s;
	s.insert(10);
	s.insert(20);
	s.insert(30);
	s.insert(40);
	s.insert(30);
	s.insert(30);
	s.insert(30);

	int num=s.count(30);
	//对于set而言,由于set容器不能包含重复元素 所以count只能返回1或0
	cout << " num=" << num << endl;
}



void main()
{
	//_04Test01();
	_04Test02();
}

set和multiset区别

区别:

  • set不可以插入重复数据,而multiset可以
  • set插入数据的同时会返回插入结果,表示插入是否成功
  • multiset不会检测数据,因此可以插入重复数据
#include<iostream>
using namespace std;
#include<set>
// set和multiset的区别

void _05Test01()
{
	set<int>s;
	pair<set<int>::iterator, bool> ret;

	//第一次插入10的时候可以成功插入
	ret= s.insert(10);
	if (ret.second)
	{
		cout << "插入成功" << endl;
	}
	else
	{
		cout << "插入失败" << endl;
	}

	//第二次插入1-的时候,插入失败
	ret = s.insert(10);
	if (ret.second)
	{
		cout << "插入成功" << endl;
	}
	else
	{
		cout << "插入失败" << endl;
	}
}

void _05Test02()
{
	multiset<int> ms;
	ms.insert(10);
	ms.insert(10);
	ms.insert(10);
	ms.insert(10);

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

void main()
{
	//_05Test01();
	_05Test02();
}

set容器排序

set容器默认排序规则是由小到大,掌握如何改变排序规则

只要技术点:

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

仿函数:

  • 所谓的仿函数(functor),是通过重载()运算符模拟函数形为的类。
      因此,这里需要明确两点:
      1 仿函数不是函数,它是个类;
      2 仿函数重载了()运算符,使得它的对你可以像函数那样子调用(代码的形式好像是在调用函数)。

示例:

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

//set容器  排序
class MySort
{
public:
	//重载()
	bool operator()(int num1, int num2)const
	{
		//按照降序排列
		return num1 > num2;
	}

};

void _07Test01()
{
	//在插入数据前先指定排序规则(利用仿函数)
	set<int,MySort> mySet;
	mySet.insert(10);
	mySet.insert(30);
	mySet.insert(20);
	mySet.insert(50);
	mySet.insert(40);

	for(set<int,MySort>::iterator it=mySet.begin();it!=mySet.end();it++)
	{
		cout << *it << " ";
	}

	cout << endl;
}

void main()
{
	_07Test01();
}

set容器存放自定义数据类型-排序

技术要点:

  • 利用仿函数改变排序规则

示例:

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

//set容器 存放自定义数据类型 并自定义排序规则

class Person
{

public:
	string m_Name;
	int m_Age;

public:
	Person(string name,int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}
};

class MyCompare
{
public:
	bool operator()(const Person &p1,const Person &p2)const
	{
		if (p1.m_Age == p2.m_Age)
		{
			return p1.m_Name < p2.m_Name;
		}
		else
		{
			return p1.m_Age < p2.m_Age;
		}	
	}
};

void _08Test01()
{
	Person p1("刘备", 24);
	Person p2("张飞", 35);
	Person p3("关羽", 28);
	Person p4("诸葛亮", 23);
	Person p5("赵云", 28);
	Person p6("吕布", 28);
	Person p7("貂蝉", 28);

	set<Person, MyCompare> s;
	s.insert(p1);
	s.insert(p2);
	s.insert(p3);
	s.insert(p4);
	s.insert(p5);
	s.insert(p6);
	s.insert(p7);

	for (set<Person, MyCompare>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << "姓名:" << it->m_Name << "\t年龄:" << it->m_Age << endl;
	}
}

void main()
{
	_08Test01();
}
### C++ `set` 容器概述 `set` 是 C++ 标准库中的关联容器之一,用于存储唯一的元素并自动保持这些元素处于排序状态。该容器内部通常通过红黑树实现,这使得插入、删除和查找操作的时间复杂度均为 O(log n)[^4]。 #### 基本构造方式 可以使用默认构造函数创建一个空集合: ```cpp #include <set> using namespace std; // 创建一个空的整数集 set<int> emptySet; ``` 也可以利用已有的数据结构来初始化一个新的 `set` 对象: ```cpp vector<int> vec = {7, 3, 6, 9, 3, 1, 6, 2}; set<int> fromVector(vec.begin(), vec.end()); ``` #### 自定义排序规则 除了按自然顺序排列外,还可以通过提供第二个模板参数来自定义比较逻辑。例如,要建立一个降序排列的整数集合,则可采用如下形式: ```cpp struct Greater { bool operator()(const int& lhs, const int& rhs) const { return lhs > rhs; } }; set<int, Greater> descendingInts; ``` 或者更简洁地使用标准库提供的 `greater<T>` 类型作为第二模板参数: ```cpp set<int, greater<int>> descSet{8, 5, 3, 7}; // 初始化列表语法 ``` 上述两种方法均实现了相同的效果——即构建了一个按照数值大小逆向排序的整数集合[^1][^3]。 #### 集合的基本操作 对于已经存在的 `set` 实例来说,支持多种常见的成员函数来进行增删查改等常规处理动作。下面列举了一些常用的 API 接口及其简单应用实例: - **插入新项** 插入单个元素至集合中: ```cpp set<double> numbers; auto resultPair = numbers.insert(3.14); ``` - **移除现有条目** 移除特定值对应的节点: ```cpp if (!numbers.empty()) { size_t removedCount = numbers.erase(*numbers.begin()); } ``` - **查询是否存在某元素** 判断给定的目标是否存在于当前范围内: ```cpp double targetValue = 2.718; auto foundIt = numbers.find(targetValue); if (foundIt != numbers.end()) { cout << "Found value: " << *foundIt << endl; } else { cout << "Not Found!" << endl; } ``` - **遍历全部组件** 迭代访问每一个成员变量直至结束标志位为止: ```cpp for (const auto& elem : numbers) { printf("%.2f\n", elem); } // 或者传统风格迭代器循环 for (auto iter = numbers.cbegin(); iter != numbers.cend(); ++iter) { cout << *iter << ' '; } ``` 以上就是关于如何运用 C++ 编程语言里的 `set` 数据类型的介绍以及一些基础的操作指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值