C++:STL容器-map
- 1. map构造和赋值
 - 2. map大小和交换
 - 3. map插入和删除
 - 4. map查找和统计
 - 5. map容器排序
 
map中所有元素都是pair(对组)
pair中第一个元素为key(键),起到索引作用,第二个元素为value(实值);
索引元素都会根据元素的键值自动排序;
本质上:map/multimap属于关联式容器,底层结构都是用二叉树实现。
 优点:可以根据key值快速找到value值
 map/multimap区别: map不允许容器中有重复key值元素;multimap允许容器中有重复key值元素。
头文件为:#include <map>
1. map构造和赋值
map<T1,T2> mp; //map默认构造函数
map(const map &mp); // 拷贝构造函数
map& operator = (const map &mp); // 重载等号操作赋值
#include <iostream>
#include <map>
using namespace std;
void printMap(map<int,int> &mp){
    for(auto & it : mp){
        cout << "key=" << it.first << " value=" << it.second <<endl;
    }
    cout << endl;
}
int main() {
    map<int,int> m;
    m.insert(pair<int,int>(1,10));
    m.insert(pair<int,int>(3,8));
    m.insert(pair<int,int>(2,7));
    printMap(m);
    return 0;
}
 

2. map大小和交换
size();
empty();
swap(mp); // 交换操作
int main() {
    map<int,int> m;
    m.insert(pair<int,int>(1,10));
    m.insert(pair<int,int>(3,8));
    m.insert(pair<int,int>(2,7));
    printMap(m);
    cout << "m的大小为:" << m.size() << endl;
    cout << "m是否为null:" << m.empty() << endl;
    map<int,int> m2;
    m2.insert(pair<int,int>(100,10));
    m2.insert(pair<int,int>(101,20));
    printMap(m2);
    m2.swap(m);
    // 交换操作
    printMap(m);
    printMap(m2);
    return 0;
}
 

3. map插入和删除
insert(elem); //在容器中插入元素
clear(); // 清除所有元素
erase(pos); // 删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end); // 删除区间[beg,end)的所有元素,返回下一个元素的迭代器
erase(key); // 删除容器中值为key的元素
int main() {
    map<int,int> m;
    // map容器插入元素的方法
    m.insert(pair<int,int>(1,10));
    // 1
    m.insert(make_pair(3,8));
    // 2
    m.insert(map<int,int>::value_type (2,7));
    // 3
    m[-1] = 100;
    // 4 不推荐使用这种方式进行插入操作,建议进行访问
    printMap(m);
    auto it = m.begin();
    it = m.erase(it);
    // 删除第一个元素
    printMap(m);
    m.erase(2);
    // 删除键为2的元素
    printMap(m);
    return 0;
}
 

4. map查找和统计
find(key); // 查找key是否存在,若存在,返回该键元素的迭代器;若不存在,返回set.end();
count(key); // 统计key的元素个数
int main() {
    map<int,int> m;
    for (int i=1;i<5;i++)
    {
        m.insert(make_pair(i,i+1));
    }
    printMap(m);
    auto it = m.find(2);
    if(it != m.end())
    {
        cout << "m存在键值为2的数" << endl;
    }
    else
    {
        cout << "m不存在键值为2的数" << endl;
    }
    return 0;
}
 

5. map容器排序
利用仿函数,改变排序规则
class MyCompare{
public:
    bool operator()(int v1,int v2){
        return v1 > v2;
    }
};
int main() {
    map<int,int> m;
    for (int i=1;i<5;i++)
    {
        m.insert(make_pair(i,i+1));
    }
    printMap(m);
    map<int,int,MyCompare> m2;
    for (int i=1;i<5;i++)
    {
        m2.insert(make_pair(i,i+1));
    }
    for (auto &it :m2) {
        cout << "key=" << it.first << " value=" << it.second <<endl;
    }
    return 0;
}
 




















