当前位置: 代码迷 >> 综合 >> 成长随心记13(c++容器,set/multiset,map/multimap)
  详细解决方案

成长随心记13(c++容器,set/multiset,map/multimap)

热度:38   发布时间:2023-12-04 23:03:11.0

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;
    }
}