Standard Template Library
在这一篇中我开始学习集合这个容器,即set。
1.头文件
#Include <set>
using namespace std;
2.定义
与vector的定义类似例如:set s;
就定义了一个存储数据类型为TYPE的名叫s的集合。
3.关于set的一些基本操作和函数
- s.insert(‘A’)-----O(logn)
在集合中插入一个 A字符 - s.erase(‘B’)-----O(logn)
在集合中删除一个’B’字符,特别地,如果集合中没有该元素,那么不会执行删除操作,也不会报错。 - s.count(‘C’)-----O(logn)
统计集合中C的个数,因为集合元素具有不重复性所以,只可能有1个或者0个。 - s.clear() ----- O(n)
与vector类似,只会使得长度变为0,不会释放内存。 - s.sizse()-----O(1)
返回集合的长度,与手写的链表类似,长度是直接保存着的,所以时间复杂度为O(1)。 - set::iterator it
集合元素的索引需要迭代器,迭代器可以想象与指针类似,上面是定义了一个迭代器,后面通过例子来具体体会迭代器。
下面还是来看一个例子:
#include <iostream>
#include <set>
using namespace std;
int main()
{
set <char> s;
s.insert('D'); //向集合中插入元素
s.insert('A');//插入时是无序的,但集合会默认生序排列
s.insert('C');
s.insert('B');
set<char>::iterator it;
for(it=s.begin();it != s.end();it++)
{
printf("%c ",*it);
}
printf("\n");
s.erase('a');//删除集合中没有的元素不会报错,但是也不会有任何操作
s.erase('A');
for(it=s.begin();it != s.end();it++) //集合放入元素后默认从小到大放置
{
printf("%c ",*it);
}
printf("\n");
//再看一下s中的元素
for(it=s.begin();it != s.end();it++)
{
printf("%c ",*it);
}
printf("\n");
printf("length = %d\n",(int)s.size());
if((int)s.count('B')) printf("B belong to the set s!\n");
s.clear();
printf("length = %d",(int)s.size());
return 0;
}
运行结果如下:
A B C D
B C D
B C D
length = 3
B belong to the set s!
length = 0
ps:集合与结构体一起使用需要重载小于号,因为集合不知道怎么来排列结构体,需要人为给它一个排列结构体的规则。