STL set-multiset

set和multiset特点
  1. set和multiset是以RB-tree(红黑树,平衡二叉树的一种)为底层机制,查找效率非常好,所有元素会根据元素的值自动进行排序
  2. set容器中不允许重复元素,multiset允许重复元素
  3. multiset和 set不可以通过迭代器来改变元素的值。因为multiset和 set集合是根据元素值进行排序,关系到multiset和 set的排序规则,如果任意改变multiset和 set的元素值,会严重破坏multiset和 set组织。正确做法是先删除那个元素,再插入不同元素。
set赋值操作

set没有push_back插入操作,set是用insert插入,默认从小到大。set第二个参数用来定义排序准则。缺省准则less是一个仿函数,以operator<对元素进行比较。

	set<int> s1;	
	s1.insert(2);
	s1.insert(4);
	s1.insert(5);
	s1.insert(1);
	//结果为1,2,4,5,
	//仿函数,设定从大到小排序准则
class mycompare{
public:
	bool operator()(int v1, int v2){
		return v1 > v2;
	}
};
	set<int,mycompare> s2;	//从大到小
	s2 = s1;
set查找操作

find(key);//查找键key是否存在,返回该键的元素的迭代器,若不存在,返回迭代器end()
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器
upper_bound(keyElem);//找第一个大于key的值
equal_range 返回lower_bound 和 upper_bound相等的上下限的两个迭代器

//查找键key是否存在,返回该键的元素的迭代器;若不存在,返回end()
set<int>::iterator ret = s1.find(4);
if (ret == s1.end()){
	cout << "没有找到" << endl;
}
else
	cout << *ret << endl;
set更改默认排序
class Person{
public:
	Person(int age, int id) :id(id), age(age){};
public:
	int id;
	int age;
};

class mycompare2{
public:
	bool operator()(Person p1, Person p2){
		return p1.age > p2.age;
	}
};
 int main()
 {
 set<Person, mycompare2> sp;//set需要排序,当你放对象的时候,set不知道怎么排序
    	Person p1(10, 20), p2(30, 40), p3(50, 60);
    	sp.insert(p1);
    	sp.insert(p2);
    	sp.insert(p3);
    	Person p4(10, 30);
    	for (set<Person, mycompare2>::iterator it = sp.begin(); it != sp.end(); it++)
    	{
    		cout << (*it).age << " " << (*it).id << endl;
    	}
    	//查找 因为是根据age进行排序,所以查找是查找age
    	set<Person, mycompare2>::iterator ret = sp.find(p4);
    	if (ret == sp.end()){
    		cout << "没有找到" << endl;
    	}
    	else{
    		cout << "找到:" << (*ret).age << " " << (*ret).id << endl;
    	}
    }	
 }   
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值