set和multiset特点
- set和multiset是以RB-tree(红黑树,平衡二叉树的一种)为底层机制,查找效率非常好,所有元素会根据元素的值自动进行排序
- set容器中不允许重复元素,multiset允许重复元素
- 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;
}
}
}