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:1
cout << setInt.value_comp()(8, 7) << endl; //false:0
cout << setInt.key_comp()(7, 8) << endl; //true:1
cout << 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