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; //获取值比较函数对象
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; //获取值比较函数对象