关联容器(一):set

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值