STL关联式容器—set的使用

一、set介绍:
  1. set是按照一定次序存储元素的容器;
  2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素;
    不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们;
  3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序;
  4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代;
  5. set在底层是用二叉搜索树(红黑树)实现的。

注意:

  • 与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放value,但在底层实际存放的是由<value, value>构成的键值对;
  • set中插入元素时,只需要插入value即可,不需要构造键值对; set中的元素不可以重复(因此可以使用set进行去重);使用set的迭代器遍历set中的元素,可以得到有序序列;set中的元素默认按照小于来比较。
二、set容器使用:
  1. 构造函数:
  •   (1)set (const Compare& comp = Compare(), const Allocator& =Allocator() ); :构造空的set
      (2)set (InputIterator first, InputIterator last, const Compare&comp = Compare(), const Allocator& = Allocator() ); :用[first, last)区间中的元素构造set
      (3)set ( const set<Key,Compare,Allocator>& x); set的拷贝构造
    
  1. set迭代器:
  •   (1)iterator begin()  :返回set中起始位置元素的迭代器
      (2)iterator end() :返回set中最后一个元素后面的迭代器
      (3)const_iterator cbegin() const :返回set中起始位置元素的const迭代器
      (4)const_iterator cend() const :返回set中最后一个元素后面的const迭代器
      (5)reverse_iterator rbegin() :返回set第一个元素的反向迭代器,即end
      (6)reverse_iterator rend() :返回set最后一个元素下一个位置的反向迭代器,即rbegin
      (7)const_reverse_iterator crbegin() const :返回set第一个元素的反向const迭代器,即cend
      (8)const_reverse_iterator crend()const :返回set最后一个元素下一个位置的反向const迭代器,即crbegin
    
  1. set容量:
  •   bool empty ( ) const :检测set是否为空,空返回true,否则返回true
      size_type size() const :返回set中有效元素的个数
    
  1. set修改操作:
  •   (1)pair<iterator,bool> insert (const value_type& x )
      在set中插入元素x,实际插入的是<x, x>构成的键值对,如果插入成功,返回<该元素在set中的位置,true>,如果插入失败,说明x在set中已经存在,返回<x在set中的位置,false>
      (2)void erase ( iterator position ) 删除set中position位置上的元素
      (3)size_type erase ( const key_type& x ) 删除set中值为x的元素,返回删除的元素的个数
      (4)void erase ( iterator first,iterator last ) 删除set中[first, last)区间中的元素
      (5)void swap (set<Key,Compare,Allocator>&st );交换set中的元素
      (6)void clear ( ) 将set中的元素清空
      (7)iterator find ( constkey_type& x ) const 返回set中值为x的元素的位置
      (8)size_type count ( constkey_type& x ) const 返回set中值为x的元素的个数.
    
#include<set>
using namespace std;
int main()
{
	int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 10 };
	set<int> s1(arr, arr + sizeof(arr) / sizeof(int));
	for (auto& e : s1)
	{
		cout << e << " ";
	}
	cout << endl;

	for (auto it = s1.rbegin(); it != s1.rend(); ++it)
		cout << *it << " ";
	cout << endl;
	// set中值为3的元素出现了几次
	cout << s1.count(3) << endl;

	return 0;
}

三、set的模拟实现:

利用红黑树实现set:

namespace ice
{
	template<class K>
	class set
	{
		typedef K ValueType;
		// 作用是:将value中的key提取出来
		struct KeyOfValue
		{
			const K& operator()(const ValueType& key)
			{
				return key;
			}
		};
		// 红黑树类型重命名
		typedef RBTree<K, ValueType, KeyOfValue> RBTree;
	public:
		typedef typename RBTree::Iterator iterator;
	public:
		Set(){}
		/
		// Iterator
		iterator Begin()
		{
			return _t.Begin();
		}
		iterator End()
		{
			return _t.End();
		}
		/
		// Capacity
		size_t size()const
		{
			return _t.Size();
		}
		bool empty()const
		{
			return _t.Empty();
		}
		
		// modify
		pair<iterator, bool> insert(const ValueType& data)
		{
			return _t.Insert(data);
		}
		void clear()
		{
			_t.Close()
		}
		iterator find(const K& key);
	private:
		RBTree _t;
	};
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值