set/multiset容器
- Set基本概念
- set构造和赋值
- set的大小和交换
- set的插入和删除
- set查找和统计
- set和multiset的区别
- pair对组
- 两种创建方式
- set容器排序
Set基本概念
所有元素都会在插入时自动被排序。
set/multist容器属于关联式容器,底层结构属于二叉树。
set不允许容器中有重复的元素,multiset允许容器中有重复的元素。
set构造和赋值
1、set<T> st;
默认构造函数
2、set(const set &st);
拷贝构造函数
3、set& operator=(const set &st);
赋值
void test1() {
set<int> st;
st.insert(10);
st.insert(40);
st.insert(30);
st.insert(1);
st.insert(30);
p(st);
set<int> s2(st);
p(s2);
set<int> s3;
s3= s2;
p(s3);
}
set的大小和交换
1、empty();
判断容器是否为空
2、size();
返回容器中元素的个数
3、swap(st);
交换两个集合容器
void test1() {
...
if (!st.empty()) {
cout << "大小" << st.size()<<endl;
}
set<int> s2;
s2.insert(32);
s2.insert(23);
s2.insert(43);
st.swap(s2);
p(st);
}
set的插入和删除
1、insert(elem);
插入,只有这一种方法
2、clear();
清空所有元素
3、erase(pos);
删除pos位置的元素,返回下一个数据的位置
4、erase(beg,end);
删除迭代器从beg到end之间的元素,返回下一个数据的位置
5、erase(elem);
删除容器中值为elem的元素
void test1() {
...
st.erase(st.begin());
st.erase(++st.begin(), --st.end());
p(st);
st.erase(10);
p(st);
st.clear();
p(st);
}
set查找和统计
1、find(key);
查找key是否存在,若存在,返回该键的元素的迭代器,若不存在,返回set.end()
2、count(key);
统计key的元素个数
void test1() {
...
set<int>::iterator pos=st.find(40);
if (pos != st.end()) {
cout << "找到:" <<*pos<< endl;
}
else {
cout << "没找到" << endl;
}
cout << st.count(30) << endl;//统计的结果式0或1
}
set和multiset的区别
1、set不可以插入重复数据,multiset可以
2、set插入数据的同时会返回插入结果,表示插入成功
3、multiset不会监测数据,因此可以插入重复数据
void test1() {
set<int> st;
pair<set<int>::iterator, bool> ret = st.insert(30);
if (ret.second) {
cout << "第一次插入成功" << endl;
}
else {
cout << "第一次插入失败" << endl;
}
ret=st.insert(30);
if (ret.second) {
cout << "第二次插入成功" << endl;
}
else {
cout << "第二次插入失败" << endl;
}
}
m.insert(10);//直接插入不会检测
m.insert(10);
for (multiset<int>::const_iterator it = m.begin();it != m.end();it++) {
cout << (*it) << " ";
}
cout << endl;
返回是一个对组
multiset插入返回的是一个迭代器
pair对组
两种创建方式
1、pair<type,type> p(value1,value2);
2、pair<type,type> p=make_pair(value1,value2);
void test() {
pair<string, int>p("Tom", 20);
cout << "姓名:" << p.first << "年龄:" << p.second << endl;
pair<string, int>p1=make_pair("Ala", 23);
cout << "姓名:" << p1.first << "年龄:" << p1.second << endl;
}
set容器排序
在使用仿函数排序时,需要加const不可修改,不然会报错,set的排序规则下定义是需要设置好,默认是升序。
class S {
public:
int age;
string name;
int h;
S(string _n, int _a,int _h) {
name = _n;
age = _a;
h = _h;
}
};
class compareS {
public:
bool operator()(S v1, S v2) const{
return v1.age > v2.age;
}
};
class MyCompare {
public:
bool operator()( int v1, int v2)const {
return v1 > v2;
}
};
//内置类型排序
void test1() {
//指定排序规则为大到小
set<int,MyCompare> s2;
s2.insert(10);
s2.insert(40);
s2.insert(30);
s2.insert(1);
s2.insert(30);
for (set<int,MyCompare>::iterator it = s2.begin();it != s2.end();it++) {
cout << (*it) << " ";
}
}
//自定义类型排序
void test() {
set<S, compareS> s;
S s1("Tom", 18, 187);
S s2("Lisa", 20, 165);
S s3("LuJy", 34, 190);
S s4("Tony", 21, 167);
S s5("Ala", 20, 168);
s.insert(s1);
s.insert(s2);
s.insert(s3);
s.insert(s4);
s.insert(s5);
for (set<S, compareS>::iterator it = s.begin();it != s.end();it++) {
cout << "姓名:" << (*it).name << "\t年龄:" << (*it).age << "\t身高:" << (*it).h << endl;
}
}