关联式容器set详解

STL源码剖析---关联式容器set详解

什么是set

上篇博客详细介绍了关联式容器map ,今天我们来了解一下它的姊妹篇–set.

set也属于关联式容器.他们俩底层都由红黑树实现,所以set的查询,插入,删除效率都很高,且

set内的数据也是有序的(默认升序)。但map的缺点set也有,不能够存储不能比较的数据,且数

据不重复。set存储的数据只有key值,但底层仍然按照键值对pair< key key >来存储,即键值与

实值相等.。他和map的区别也就体现在这里了,map可以虽然不能修改键值key,但是可以修

改实值value。而set这个容器就很"自闭",因为键值和实值相等的缘故,任意修改哪个值都

会引起搜索树的乱序。所以记住:这个容器不支持修改!不支持operator[ ],只能插入,删

除,查找。同样,它和multiset之前的区别也只有键值不能够重复这一点。

下面是set容器的源码,我们来看一看。

  template<typename _Key, typename _Compare = std::less<_Key>,
	   typename _Alloc = std::allocator<_Key> >     //这儿就只传了一个key,不像map传2个
    class set
    {
  	  public:     
		   typedef _Key     key_type;
		   typedef _Key     value_type;//value和key都是key
		   typedef _Compare key_compare;//比较器,通常传函数指针和仿函数。
		   typedef _Compare value_compare;
		   typedef _Alloc   allocator_type;
	}
set的迭代器

在这里插入图片描述
以上就是set迭代器的常用函数,其实大多的容器都支持iterator ,const_iterator ,reverse_iterator这3种,没啥好说的。

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中其键值大于指定键的键值的第一个元素。
代码测试
#include<iostream>
#include <set>


using namespace std;
void printSet(set<int>& s)
{
	for (auto& e : s)
		cout << e << " ";
	cout << endl;
}
void TestSet()
{
	// 用数组array中的元素构造set
	int array[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0, 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
	set<int> s(array, array + sizeof(array) / sizeof(array));
	cout <<"s.size() = "<< s.size() << endl;
	// 正向打印set中的元素,从打印结果中可以看出:set可去重
	printSet(s);


	s.insert(2);//插入1
	s.insert(s.end(), 3);//尾插3

	printSet(s);

	s.erase(3);//删掉3
	set<int> s1(s);//拷贝构造

	s.clear();
	printSet(s);
}

int main()
{
	TestSet();
	system("pause");
	return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值