STL set mutiset

15 篇文章 0 订阅
1.概念: set是一个集合容器他不是序列容器而是一个相关容器,也就是迭代器的移动并不是线性的。而且这里的set是采用二叉树做物理存储的。这棵二叉树是一个排序二叉树也就是在中序遍历时是按 〈运算排列的。同时set中是没有重复的元素的。因为set是一个个相关容器,但也是特殊的相关容器,也就是他的健和值是相同的,这不同于map容器。set的迭代器是一种双向的迭代器。


2.类的定义


template <
   class Key,            //健也是值类型
   class Traits=less<Key>,   //比较谓词,默认是 < 
   class Allocator=allocator<Key> 
>
class set


template <
   class Key, 
   class Compare=less<Key>, 
   class Allocator=allocator<Key> 
>
class multiset






3.迭代器


迭代器的++就是以这个元素开始的中序遍历顺序,而--则是中序的相反,所谓中序就是(左子树,根,右子树)
其中begin是最左的左叶子的位置,而end-1则是最右的左叶子或者右叶子


因为set中健和值是同一个数据所以迭代器的*运算符返回的即是键也是值


4.multiset, set : 前者支持元素重复,而后者不支持




5.set的插入和删除


pair <iterator, bool> insert(
   const value_type& _Val
);  //将一个值插入到set的正确位置,函数返回一个对,若容器中有这个数据则直接返回{值的迭代, false},而容器中没有这个值时返回{迭代器, true}


//对于multiset来说不是返回对而是直接返回迭代器




iterator insert(
   iterator _Where,   //这种插入主要是用于减少插入的时间,因为_Val将会从_Where处进行比较而不是从头开始比较
   const value_type& _Val
);   //函数返回新元素所在的位置,若元素存在则返回元素所在的迭代器


如果容器元素为空则_Where参数无意义
如果_Where为end()为begin()都可以.




template<class InputIterator>
   void insert(
      InputIterator _First,
      InputIterator _Last
   );  //这里不要求要有序






iterator erase(
   iterator _Where
);  //返回_Where的下一个迭代器


iterator erase(
   iterator _First,
   iterator _Last
);   //返回_Last


size_type erase(
   const key_type& _Key      //返回删除了多少个以Key为键的元素(set为0或者1  multiset则可能返回多个
);




6.set, multiset的特别函数


//元素个数统计
size_type count(
   const Key& _Key   //返回等于_Key的元素的个数,对于set来说总是1或者0
) const




//元素查找,若是multiset则返回第一个找到的,而其他的相同的将会在相邻位置


iterator find(
   const Key& _Key
) const;
const_iterator find(
   const Key& _Key
) const;




//上下限


pair <const_iterator, const_iterator> equal_range (
   const Key& _Key
) const;
pair <iterator, iterator> equal_range (
   const Key& _Key
) const;


返回迭代器对,第一个是大于等于,而第二个是大于. 若有不满足条件的则返回end. 对于multiset中有多个是则返回第一个.这个也是对mulitset比较有用。








const_iterator lower_bound(
   const Key& _Key
) const;
iterator lower_bound(
   const Key& _Key
) const;    //返回大于等于_Key的迭代器,也就是第一个可以安插的位置




const_iterator upper_bound(
   const Key& _Key
) const;


iterator upper_bound(
   const Key& _Key
) const;   //返回大于_Key的迭代器,也就是最后一个可以安插的位置,这个对multiset比较有用




7.比较谓词对象的获得.


因为set是通过比较谓词函数对象来排序的, 因此在构造时需要指定函数对象.
而set中是一种特殊的关联容器,他的键和值都是一样的,因此在set中多了两种类型:


typedef Traits key_compare
typedef Traits value_compare;


//前面两个是比较函数对象的类型,在set中的比较函数对象的原形是:


bool operator()(const Key& _xVal, const Key& _yVal);    //这里表示若_xVal, _yVal调用返回true则_xVal排在_yVal的前面






typedef Key key_type;   //定义键的类型




key_compare key_comp( ) const;   //获取键比较函数对象
value_compare value_comp( ) const;    //获取值比较函数对象









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值