最近发现C++ STL Set 容器是个好东东,所以学习了一下
以下博客内容转自:http://blog.sina.com.cn/s/blog_779cf3410101389s.html
有些地方自己稍微补充了一下
set是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就 像一个集合一样。所有的操作的都是严格在logn时间之内完成,效率非常高。 set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同。
创建 multiset
删除:如果删除元素a,那么在定义的比较关系下和a相等的所有元素都会被删除
base.count(a ):set能返回0或者1,multiset是有多少个返回多少个.
Set和multiset都是引用
set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。
平衡二叉检索树使用中序遍历算法,检索效率高于vector、deque和list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。
构造set集合主要目的是为了快速检索,不可直接去修改键值
但是由于需要排序,所以元素必须有一个序,即大小的比较关系,比如 整数可以用<比较.
include
typedef struct
{定义类型 }
ss(类型名);
struct cmp
{
bool operator()( const int&a, const int &b ) const
{定义比较关系<}
};
(运算符重载,重载<)
set
注:定义了<,==和>以及>=,<=就都确定了,STL的比较关系都是用<来确定的,所以必须通 过定义< --“严格弱小于”来确定比较关
begin() 返回指向第一个元素的迭代器
clear() 清除所有元素
count() 返回某个值元素的个数
empty() 如果集合为空,返回true
end() 返回指向最后一个元素的迭代器
equal_range() 返回集合中与给定值相等的上下限的两个迭代器
erase() 删除集合中的元素
find() 返回一个指向被查找到元素的迭代器
get_allocator()返回集合的分配器
insert() 在集合中插入元素
lower_bound() 返回指向大于(或等于)某值的第一个元素的迭代器
key_comp() 返回一个用于元素间值比较的函数
max_size() 返回集合能容纳的元素的最大限值
rbegin() 返回指向集合中最后一个元素的反向迭代器
rend() 返回指向集合中第一个元素的反向迭代器
size() 集合中元素的数目
swap() 交换两个集合变量
upper_bound() 返回大于某个值元素的迭代器
value_comp() 返回一个用于比较元素间的值的函数
#include
#include
using namespace std;
typedef struct {
int a,b;
char s;
}newtype;
struct compare //there is no ().
{
bool operator()(const newtype &a, const newtype &b) const
{
return a.selement;
int main()
{
newtype a,b,c,d,t;
a.a=1; a.s='b';
b.a=2; b.s='c';
c.a=4; c.s='d';
d.a=3; d.s='a';
element.insert(a);
element.insert(b);
element.insert(c);
element.insert(d);
set::iterator it;
for(it=element.begin(); it!=element.end();it++)
cout<<(*it).a<<" ";
cout<
element自动排序是按照chars的大小排序的;
#include
#include
using namespace std;
bool fncomp (int lhs, int rhs) {return lhs first; // emptyset of ints
int myints[]= {10,20,30,40,50};
set second(myints,myints+5); // pointers used as iterators
set third (second); // a copyof second
set fourth(second.begin(), second.end()); // iterator ctor.
set fifth; // classas Compare
bool(*fn_pt)(int,int) = fncomp;
setsixth (fn_pt); // function pointer as Compare
return 0;
}