c++ 容器set

1set基本特点:

        set集合容器实现了红黑树(Red-BlackTree)的平衡二叉检索树的的数据结构,在插入元素时,它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值;另外,还得确保根节点的左子树的高度与有字数的高度相等,这样,二叉树的高度最小,从而检索速度最快。要注意的是,它不会重复插入相同键值的元素,而采取忽略处理。

        平衡二叉检索树的检索使用中序遍历算法,检索效率高于vectordeque、和list的容器。另外,采用中序遍历算法可将键值由小到大遍历出来,所以,可以理解为平衡二叉检索树在插入元素时,就会自动将元素按键值从小到大的顺序排列。

2、set基本操作:
#include<set>
#include<iostream>
#include<string>

using namespace std;

//自定义比较函数,如果不定义,则默认从小到大排列
struct mycomp {
	bool operator()(const int &a, const int &b) {
		return a > b;
	}
};

//如果元素是结构体,可以直接把比较函数写在结构体中
struct Info {
	string name;
	int score;
	bool operator < (const Info &a) const {
		return a.score < score;
	}
};

int main()
{
	//set构造方法
	set<int> s1;//方法一
	int d[] = { 1,4,4,3,6,8 };
	set<int> s2(d, d + 5);//方法二
	set<int> s3(s2.begin(), s2.end());//方法三

	//set插入方法
	s1.insert(1);
	s1.insert(5);
	s1.insert(7);
	s1.insert(3);
	s1.insert(5);//重复,不插入

	//set遍历
	set<int>::iterator it = s2.begin();
	for (it; it != s2.end(); it++) {
		cout << *it;
	}
	cout << endl;

	//set反向遍历,reverse_iterator配合rbegin、rend
	set<int>::reverse_iterator rit = s2.rbegin();
	for (rit; rit != s2.rend(); rit++) {
		cout << *rit;
	}
	cout << endl;

	//set删除
	it = s3.begin();
	for (int i = 0; i < 2; i++)
		it = s3.erase(it);
	for (it = s3.begin(); it != s3.end(); it++)
		cout << *it << " ";
	cout << endl;

	s3.clear();//清空数据
	cout << s3.size() << endl;

	//元素检索
	it = s2.find(5);
	if (it != s2.end()) {
		cout << "find elem 5" << endl;
	}
	else {
		cout << "not find elem 5" << endl;
	}
	//通过count方法判断
	if (s2.count(6)) {
		cout << "find elem 6" << endl;
	}
	else {
		cout << "not find elem 6" << endl;
	}

	//自定义比较函数
	int d2[] = { 2,8,3,9,1 };
	set<int, mycomp> s4;
	s4.insert(1);
	s4.insert(5);
	s4.insert(7);
	s4.insert(3);
	set<int, mycomp>::iterator it4 = s4.begin();
	for (it4; it4 != s4.end(); it4++) {
		cout << *it4;
	}
	cout << endl;

	//自定义结构体
	set<Info> s;
	Info info;
	info.name = "Jack";
	info.score = 80;
	s.insert(info);
	info.name = "Tom";
	info.score = 99;
	s.insert(info);
	info.name = "Steaven";
	info.score = 60;
	s.insert(info);

	set<Info>::iterator it5 = s.begin();
	for (it5; it5 != s.end(); it5++) {
		cout << (*it5).name << " : " << (*it5).score << endl;
	}

    return 0;
}

Set常用函数:跟其他容器的函数差不多

begin()--返回指向第一个元素的迭代器

clear()--清除所有元素

count()--返回某个值元素的个数

empty()--如果集合为空,返回true

end()--返回指向最后一个元素的迭代器

equal_range()--返回集合中与给定值相等的上下限的两个迭代器

erase()--删除集合中的元素

find()--返回一个指向被查找到元素的迭代器

get_allocator()--返回集合的分配器

insert()--在集合中插入元素

:lower_bound()--返回指向大于(或等于)某值的第一个元素的迭

key_comp()--返回一个用于元素间值比较的函数

max_size()--返回集合能容纳的元素的最大限值

rbegin()--返回指向集合中最后一个元素的反向迭代器

rend()--返回指向集合中第一个元素的反向迭代器

size()--集合中元素的数目

swap()--交换两个集合变量

upper_bound()--返回大于某个值元素的迭代器

value_comp()--返回一个用于比较元素间的值的函数





### C++ 中 `std::set` 的使用方法和特性 #### 1. 基本概念 `std::set` 是 C++ 标准模板库 (STL) 提供的一种关联容器,用于存储唯一的有序元素。它基于平衡二叉树实现,默认情况下按照升序排列[^1]。 #### 2. 默认构造函数 可以通过以下方式创建一个空的 `std::set` 容器: ```cpp #include <set> std::set<int> mySet; // 创建一个空的整数类型set 容器 ``` 上述代码展示了如何通过默认构造函数初始化一个 `std::set` 实例。 #### 3. 插入与删除操作 可以使用成员函数 `insert()` 向 `std::set` 添加新元素,并使用 `erase()` 删除指定元素。 ```cpp mySet.insert(5); // 插入元素 5 mySet.erase(5); // 删除元素 5 ``` #### 4. 遍历集合中的元素 利用迭代器可以遍历整个 `std::set` 容器的内容。下面是一个简单的例子展示如何打印所有元素: ```cpp for(auto it = mySet.begin(); it != mySet.end(); ++it){ std::cout << *it << " "; } // 或者更简洁的方式(C++11及以上) for(const auto& elem : mySet){ std::cout << elem << " "; } ``` 此部分功能描述来源于一般性的 STL 文档说明[^3]。 #### 5. 并集计算 如果需要求两个 `std::set` 的并集,则可借助算法头文件 `<algorithm>` 中的功能完成这一目标。例如: ```cpp #include <iostream> #include <set> #include <iterator> int main(){ std::set<int> set1{1, 2, 3}; std::set<int> set2{3, 4, 5}; std::set_union(std::begin(set1), std::end(set1), std::begin(set2), std::end(set2), std::ostream_iterator<int>(std::cout," ")); return 0; } ``` 这里实现了将两组数据合并输出到标准控制台的操作[^2]。 #### 6. 查询大小及其他常用接口 - 可调用 `size()` 方法获取当前集合内的元素数量; - 调用 `empty()` 判断该集合是否为空; - 还能运用 `swap()` 函数快速互换两个同类型对象的数据内容。 具体语法形式如下所示: ```cpp if(mySet.empty()) { std::cout << "The set is empty." << std::endl; } else{ std::cout << "Size of the set: " << mySet.size() << std::endl; } std::set<int> anotherSet; anotherSet.swap(mySet); ``` 这部分行为特征总结自官方文档资料[^4]。 ### 总结 综上所述,`std::set` 不仅提供了基本的增删查改能力,还支持高效的查找以及自动去重等功能,在实际开发过程中具有广泛的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值