关联容器(一):set

来源:互联网 发布:北电网络破产 编辑:程序博客网 时间:2024/05/29 16:47

set介绍:

set是STL中一种标准关联容器(vector,list,string,deque都是序列容器,而set,multiset,map,multimap是标准关联容器),它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列,如果需要集合中的元素允许重复那么可以使用multiset。

常用函数:

(1)    构造函数/赋值
int array[] = { 1121, 3434, 34, 4, 34343, 5566, 788 };
//set<int> setInt = { 1121, 3434, 34, 4, 34343, 5566, 788 }; //默认:升序
//set<int, greater<int>> setInt(array, array + (sizeof(array) / sizeof(int))); //降序
set<int,less<int>> setInt(array, array+(sizeof(array)/sizeof(int))); //升序


(2)    增加函数/删除函数
clear 清空set
emplace 插入一个元素(不执行copy或move操作)到set
emplace_hint 插入一个元素(不执行copy或move操作)到set,有位置
erase 从set中移除指定位置或范围的数据
insert 在set的指定位置插入一或多个元素(多个重载)

(3)    遍历函数/访问函数
begin 返回指向set中第一个元素的迭代器
end 返回指向set的结尾位置之后位置的迭代器
cbegin 返回指向set中第一个元素的const迭代器
cend 返回指向set的结尾位置之后位置的const迭代器
crbegin 返回指向set的反方向开始位置的const迭代器
crend 返回指向set的反方向结尾位置之后位置的const迭代器
rbegin 返回指向set的反方向开始位置的迭代器
rend 返回指向set的反方向结尾位置之后位置的迭代器
lower_bound 返回指向set中大于等于指定key的第一个元素的位置的迭代器
upper_bound 返回指向set中大于指定key的第一个元素的位置的迭代器
equal_range 返回迭代器对,表示指定key的lower_bound和upper_bound(first,second)
eg:*setInt.equal_range(34).second

(4)查找/替换/比较
find 返回指向set中指定key的元素位置的迭代器

value_comp返回用于对set的元素排序的比较对象的拷贝

key_comp返回用于对set的key排序的比较对象的拷贝

(5)    判断函数
empty 如果set为空,返回true

(6)    大小函数/个数函数
count 返回set中【指定键】对应的元素个数
max_size 返回set的最大长度
size 返回set中的元素个数

(7)    其他函数
get_allocator 返回创建set的Allocator的拷贝

operator= 使用另一个set的拷贝替换set中的元素
swap 交换两个set中的元素

说一说value_comp和key_comp:

key_comp用来比较key大小,value_comp用来比较value大小。
对set来说,key和value是一回事,两个东西等价。
对map来说,比如map<XXX, YYY>,key的类型是XXX,value的类型是pair<XXX, YYY>。key_comp就是用来比较XXX类型的值的东西,value_comp就是用来比较pair<XXX,YYY>的东西。但是value_comp的比较方式跟key_comp是一样的。pair<XXX, YYY>里只有XXX会被比较,YYY不参与比较。

代码:

int array[] = { 1121, 3434, 34, 4, 34343, 5566, 788 };set<int,less<int>> setInt(array, array+(sizeof(array)/sizeof(int))); //升序cout << setInt.value_comp()(7, 8) << endl; //true:1cout << setInt.value_comp()(8, 7) << endl; //false:0cout << setInt.key_comp()(7, 8) << endl; //true:1cout << setInt.key_comp()(8, 7) << endl; //false:0



示例代码:

#include <set>#include <algorithm>#include <functional>//greater<Type>必须包含此文件using namespace std;int _tmain(int argc, _TCHAR* argv[]){int array[] = { 1121, 3434, 34, 4, 34343, 5566, 788 };//set<int> setInt = { 1121, 3434, 34, 4, 34343, 5566, 788 }; //默认:升序//set<int, greater<int>> setInt(array, array + (sizeof(array) / sizeof(int))); //降序set<int,less<int>> setInt(array, array+(sizeof(array)/sizeof(int))); //升序setInt.emplace_hint(setInt.begin(), 999);cout <<"setInt.count"<< setInt.count(999) << endl;cout << "setInt.size" << setInt.size() << endl;cout << "setInt.max_size" << setInt.max_size() << endl;cout << "setInt.lower_bound(34);:" << *setInt.lower_bound(34) << endl;cout << "setInt.upper_bound(34);:" << *setInt.upper_bound(34) << endl;cout << "setInt.equal_range(34);:" << *setInt.equal_range(34).second << endl;cout << "setInt.find(34);:" << *setInt.find(34) << endl;set<int>::iterator iter;for (iter = setInt.begin(); iter != setInt.end(); iter++){cout << *iter << endl;}return 0;}
set方法使用示例,参考:http://www.howsoftworks.net/cplusplus.api/std/set_find.html

0 0