7,set/multiset 容器
功能:所有元素在插入时都会排序
性质:底层类似数据结构的二叉树
区别:set不允许有重复的数据元素
multiset允许有重复的数据元素
1)set构造函数和赋值:
函数原型:
set<T>st//默认构造
set(const set &st)//拷贝构造
set& operator=(const set &st)//重载等号操作符
2)set大小和交换
size()//返回容器元素个数
empty()//判空
swap(st)//交换两个集合容器
3)set插入和删除
clear()//清空所有元素
erase(pos)//删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end)//删除区间[beg,end)内所有元素,返回下一个元素的迭代器
erase(elem)//删除指定元素elem
insert(elem)//在容器内插入元素,有返回值pair,可以通过pair容器的bool值来查看是否插入成功
例:#include<set>
int main()
{
set<int> s;
pair<set<int>::iterator,bool> ret=s.insert(10);
if (ret.second) {
cout << "插入成功" << endl;
}
else
cout << "插入失败" << endl;
}
4)set查找和统计
find(key)//查找key是否存在,存在返回该元素的迭代器,不存在,返回set.end()
cout(key)//统计key的个数
5) set容器的排序规则
内置数据类型排序
例:
#include <set>
class mycompare {
public :
bool operator()(int v1, int v2) const {
return v1 > v2;
}
};
int main()
{
int arr[] = { 1,3,2,4,7,5,9,6 };
//从小到大(默认)
set<int>s1;
s1.insert(arr, arr + 8);
for (set<int>::iterator it = s1.begin(); it != s1.end(); it++) {
cout << *it ;
}
cout << endl;
//从大到小,可以重写比较方式
set<int, mycompare> s2;
s2.insert(arr, arr + 8);
for (set<int, mycompare>::iterator it = s2.begin(); it != s2.end(); it++) {
cout << *it ;
}
}
自定义数据类型排序
需要重写比较方式
例:
#include<set>
class person {
public:
person(int age) :mage(age) {}
int mage;
};
class mycompare {
public:
bool operator()(person p1, person p2)const {
return p1.mage > p2.mage;
}
};
int main()
{
person p1(10), p2(34), p3(24), p4(54), p5(19);
person arr[] = { p1,p2,p3,p4,p5 };
set<person,mycompare> st(arr, arr + 5);
for (set<person,mycompare>::iterator it = st.begin(); it != st.end(); it++) {
cout << it->mage << ' ';
}
}
------------------------------------------------------------------------------------------------------------------------------
8,map/multimap容器
介绍:map中所有元素都死pair
pair中第一个元素为key(键值),起到索引的作用,第二个元素为value(实值)
所有元素都会根据键值自动排序
本质:map容器属于关联式容器,底层是二叉树结构
优点:可以根据键值快速查找
区别:map不允许有重复的键值,multimap中允许
1)map的构造和赋值
函数原型:
map<T1,T2>mp//默认构造
map(const tmp&mp)//拷贝构造
map& operator=(const map &mp)//重载等号操作符
2)map的大小和交换
函数原型:
size()//返回容器内元素个数
empty()//判空
swap(mp)//交换两个容器内容
3)map的插入和删除
insert(pair<T,T>(elem,elem))//在容器内插入元素
insert(make_pair(elem,elem)//或者
clear()//清空
erase(pos)//删除pos迭代器所指的元素,返回下一个位置的迭代器
erase(beg,end)//删除区间[beg,end)内所有元素,返回下一个位置的迭代器
erase(key)//删除容器中值为键值的元素
4)map查找和统计
find(key)//查找key(键值)是否存在,存在返回该元素的迭代器,不存在,返回set.end()
cout(key)//统计key(键值)的个数
5)map容器的排序
可以修改map容器的默认排序规则
例:
class compare {
public:
bool operator()(int v1, int v2) const{
return v1 > v2;
}
};
int main()
{
pair<int, int>p1(1, 10);
pair<int, int>p2(4, 40);
pair<int, int>p3(2, 20);
pair<int, int>p4(3, 30);
pair<int,int> arr[] = { p1,p2,p3,p4};
map<int, int,compare> m;
m.insert(arr,arr+4);
for (map<int, int,compare>::iterator it = m.begin(); it != m.end(); it++) {
cout << it->first << it->second;
}
}