关联式容器set详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ferlan/article/details/86508051

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;
}

猜你喜欢

转载自blog.csdn.net/Ferlan/article/details/86508051