STL — set容器的使用详解

set容器的使用详解






其实map和set是一个爸爸 - 红黑树爸爸,只不过set力气不够,不像map那么可以拥有一个主键(key)和实键(value).它只有一个键值并且

set当中不能存储相同的键值(set还具有强迫症).  其实map和set的区别差不多就完了. 他们的相同点,他们底层都是使用红黑树构造的

这使得他们的查找,插入,删除的效率都非常的高. 并且他们都是有序的,这些都非常关键! 这是一个好的容器的标准.当然set的禁忌

也和map一样,set不能存储无法比较大小的数据.  因为构建红黑树需要比较大小. 而且在set中存储相同的键值 ,新的就会覆盖久的.

set的特性是,所有元素都会根据元素的键值自动被排序.  我们可以通过set的迭代器改变set的元素值吗? 不行,因为set元素值就是其键

值,关系到set元素的排列规则,如果任意改变set元素值,会严重破坏set组织. set的源代码之中看到,set<T>::iterator被定义为底层RB_

tree的const_iterator,杜绝写入操作. 换句话说,set iterator是一种constant iterator(相对于mutable iterator).

set拥有与list相同的某些性质: 当客户端对它进行元素新增操作或删除操作时,操作之前的所有迭代器,在操作完成之后都依然有效,当然

那个被删除元素迭代器必然是个例外.


set相关函数


 
begin返回一个迭代器,此迭代器指向set中的第一个元素。
cbegin返回一个常量迭代器,此迭代器指向set中的第一个元素。
cend返回一个迭代器,此迭代器指向set最后一个元素的下一个位置
clear清除set的所有元素。
crbegin返回一个常量迭代器,此迭代器指向反向set中的第一个元素。
crbegin返回一个常量迭代器,此迭代器指向反向set中的第一个元素。
crend返回一个常量迭代器,此迭代器指向反向set中最后一个元素之后的位置。
emplace将就地构造的元素插入到set。
emplace_hint将就地构造的元素插入到set,附带位置提示。
empty如果set为空,则返回 true。
end返回一个迭代器,此迭代器指向set最后一个元素的下一个位置
erase从指定位置移除set中的元素或元素范围。
  
find返回一个迭代器,此迭代器指向set中其键与指定键相等的元素的位置。
get_allocator返回集合中与给定值相等的上下限的两个迭代器.
insert将元素或元素范围插入到set中的指定位置。
key_comp将返回一个用于元素键值比较的函数
lower_bound返回一个迭代器,此迭代器指向set中其键值等于或大于指定键的键值的第一个元素。
max_size返回set的最大长度。
rbegin返回一个迭代器,此迭代器指向反向set中的第一个元素。
rend返回一个迭代器,此迭代器指向反向set中最后一个元素之后的位置。
size返回set中的元素数量。
swap交换两个set的元素。
upper_bound返回一个迭代器,此迭代器指向set中其键值大于指定键的键值的第一个元素。
  
  
  


访问操作:


这里我们需要掌握的函数有:begin,end,find,cbegin,cend.rbegin,rend,empty 

因为这里的rbegin,rend,cbegin.cend用法和begin和end用法相同,所以我们这里使用begin作为示范.


插入操作:


	set<int> T;


	//***1*** 最普通的插入方式
	T.insert(2);
	T.insert(3);
	T.insert(4);
	T.insert(5);
	T.insert(6);
	//插入元素

	cout << "遍历T的元素: " << " ";
	set<int>::iterator it1 = T.begin();

	while (it1 != T.end())
	
	{
		cout << *it1 << "  ";
		++it1;
	}
	cout << endl;

	//***2*** 利用数组集合插入
	set<int> OtherSet;
	int arr[10] = { 1, 2, 3, 4, 5 };
	OtherSet.insert(arr, arr + 3);

	cout << "遍历OtherSet的元素: " << " ";
	it1 = OtherSet.begin();

	while (it1 != OtherSet.end())

	{
		cout << *it1 << "  ";
		++it1;
	}
	cout << endl;

	//***3*** 利用迭代器区间进行插入

	set<int> OtherSet2;

	OtherSet2.insert(T.begin(), T.end());

	cout << "遍历OtherSet的元素: " << " ";
	it1 = OtherSet2.begin();

	while (it1 != OtherSet2.end())

	{
		cout << *it1 << "  ";
		++it1;
	}
	cout << endl;


运行结果:



删除操作:



代码演示:

	set<int> T;
	int arr[10] = { 1, 2, 3, 4, 6, 7 };

	T.insert(arr, arr + 6);

	cout << "遍历T的元素: " << " ";
	set<int>::iterator it1 = T.begin();

	while (it1 != T.end())

	{
		cout << *it1 << "  ";
		++it1;
	}
	cout << endl;


	//***1***  找到节点迭代器然后删除节点

	set<int>::iterator it2 = T.find(2);
	//先找到键值为2的迭代器,然后删除该迭代器.

	T.erase(it2);

	cout << "遍历T的元素: " << " ";
	it1 = T.begin();

	while (it1 != T.end())

	{
		cout << *it1 << "  ";
		++it1;
	}
	cout << endl;

	//***2*** 删除一个迭代器区间
	
	it2 = T.find(3);

	T.erase(it2, T.end());
	//删除3到set结束这段区间的所有元素.

	cout << "遍历T的元素: " << " ";
	it1 = T.begin();

	while (it1 != T.end())

	{
		cout << *it1 << "  ";
		++it1;
	}
	cout << endl;

	//***3*** 终极大招 clear

	T.clear();

	cout << "遍历T的元素: " << " ";
	it1 = T.begin();

	while (it1 != T.end())

	{
		cout << *it1 << "  ";
		++it1;
	}
	cout << endl;
	

运行结果:







  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值