一、 set基本概念
所有元素都会在插入时自动被排序,set/multiset属于关联式容器,底层结构是用二叉树实现。 set和multiset区别:set不允许容器中有重复的元素,multiset允许容器中有重复的元素
二、set构造和赋值
1、默认构造 set<类型> s;
2、拷贝构造 set<类型>s2(s);
3、set结果与插入顺序无关,最后结果都是有序的,所以没有头插和尾插,都是用insert
set<int> s;
s.insert(10);
s.insert(15);
s.insert(7);
printset(s);
cout << "--------" << endl;
set<int> s2(++s.begin(), s.end());
printset(s2);
cout << "--------" << endl;
set<int>s3 = s;
printset(s3);
三、大小和交换
1、容器大小size
2、容器交换swap
3、容器是否为空 empty
4、不允许重新指定容器大小,因为没有初始位置
set<int> s;
s.insert(10);
s.insert(15);
s.insert(7);
printset(s);
cout << "--------" << endl;
set<int> s2(++s.begin(), s.end());
printset(s2);
cout << "--------" << endl;
set<int>s3 = s;
printset(s3);
cout <<"容器的大小: "<< s3.size() << endl;
cout <<"容器是否为空: "<< s3.empty() << endl;
s3.swap(s2);
printset(s3);
四、插入和删除
1、插入insert
没有头插和尾插的方法,插入位置由set决定。
2、删除指定数据erase 参数可以为迭代器,也可以是具体数据
3、清空clear
s3.erase(15);
printset(s3);
s2.erase(s2.find(15));
printset(s2);
s2.clear();
cout << s2.count(15) << endl;
五、查找和统计
map和set两种容器的底层结构都是红黑树,所以容器中不会出现相同的元素,因此count()的结果只能为0和1,可以以此来判断键值元素是否存在,当然也可以使用find()方法判断键值是否存在。
find()方法返回值是一个迭代器,成功返回迭代器指向要查找的元素,失败返回的迭代器指向end。count()方法返回值是一个整数,1表示有这个元素,0表示没有这个元素。
六、multiset与set区别
1、multiset允许插入重复值
2、set插入值后有返回值,为pair队组 例如pair<iterator,bool>a a.first
set<int>s2;
pair<set<int>::iterator, bool> p = s2.insert(6);
cout << p.second << endl;
pair<string, int> aa = make_pair("zhangsan", 30);
pair<string, int> b ("王五", 30);
cout << "姓名:" << aa.first << " 年龄:" << aa.second << endl;
七、set容器自定义排序
1、加入仿函数类 重写operator函数
class Myoprator {
public:
bool operator()( int v1, int v2) const { //vs中必须加const
return v1 > v2;
}
};
2、set容器的类型中添加自定义的仿函数类。set<int,Myoprator> s;
在整个声明set容器,使用set容器的过程中都要一样添加这个仿函数类。
void printset(set<int, Myoprator>& lp) {
for (set<int,Myoprator>::const_iterator it = lp.begin(); it != lp.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
class Myoprator {
public:
bool operator()( int v1, int v2) const { //vs中必须加const
return v1 > v2;
}
};
void printset(set<int, Myoprator>& lp) {
for (set<int,Myoprator>::const_iterator it = lp.begin(); it != lp.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test() {
set<int,Myoprator> s;
s.insert(10);
s.insert(15);
s.insert(7);
printset(s);
}
int main() {
test();
}