STL之map/multimap容器

1. map/multimap基本概念

  Map的特性是,所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。

我们可以通过map的迭代器改变map的键值吗?答案是不行,因为map的键值关系到map元素的排列规则,任意改变map键值将会严重破坏map组织。如果想要修改元素的实值,那么是可以的。

Map和list拥有相同的某些性质,当对它的容器元素进行新增操作或者删除操作时,操作之前的所有迭代器,在操作完成之后依然有效,当然被删除的那个元素的迭代器必然是个例外。

Multimap和map的操作类似,唯一区别multimap键值可重复。

Map和multimap都是以红黑树为底层实现机制。

2. map/multimap常用API

  2.1 map构造函数

map<T1, T2> mapTT;//map默认构造函数: 
map(const map &mp);//拷贝构造函数

  2.2 map赋值操作

map& operator=(const map &mp);//重载等号操作符
swap(mp);//交换两个集合容器

  2.3 map大小操作

size();//返回容器中元素的数目
empty();//判断容器是否为空

  2.5 map插入数据元素操作

map.insert(...); //往容器插入元素,返回pair<iterator,bool>
map<int, string> mapStu;
// 第一种 通过pair的方式插入对象
mapStu.insert(pair<int, string>(3, "小张"));
// 第二种 通过pair的方式插入对象
mapStu.inset(make_pair(-1, "校长"));
// 第三种 通过value_type的方式插入对象
mapStu.insert(map<int, string>::value_type(1, "小李"));
// 第四种 通过数组的方式插入值
mapStu[3] = "小刘";
mapStu[5] = "小王";

  2.6 map删除操作

clear();//删除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg,end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(keyElem);//删除容器中key为keyElem的对组。

  2.7 map查找操作

find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end();
count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1。
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。

代码示例:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<map>
#include<string>
using namespace std;

void test()
{
    
    map<int, string>m1;
    m1.insert(make_pair(1, "马  云"));
    m1.insert(make_pair(2, "任正非"));
    m1.insert(make_pair(3, "李彦宏"));
    m1.insert(make_pair(4, "马化腾"));
    m1.insert(make_pair(5, "张小虎"));


    for (map<int, string>::iterator it = m1.begin(); it != m1.end(); ++it)
    {
        cout << "ID:" << it->first << " 姓名:" << it->second << endl;
    }

    //m1.find(3)返回一个迭代器,

    if (m1.find(7) != m1.end())
    {
        cout << "----------找到------------" << endl;
        cout << "ID:" << m1.find(3)->first << " 姓名:" << m1.find(3)->second << endl;
    }
    else
    {
        cout << "未找到" << endl;
    }


}
//3.8.2.6 map查找操作
//find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end();
//count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1。
//lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
//upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
//equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。


void test01()
{
    map<int, int>m;
    m.insert(make_pair(1, 10));
    m.insert(make_pair(2, 20));
    m.insert(make_pair(3, 30));
    m.insert(make_pair(4, 40));
    for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it)
    {
        //打印key值
        cout << "key:" << (*it).first << " value:" << it->second << endl;
    }
    //m.erase(key
    m.erase(3);
    cout << "----------删除后-------------" << endl;
    for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it)
    {
        //打印key值
        cout << "key:" << (*it).first << " value:" << it->second << endl;
    }

}

int main()
{

    //test();
    test01();
    system("pause");
    return EXIT_SUCCESS;
}
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<map>
#include<string>
using namespace std;

//公司今天招聘了5个员工,5名员工进入公司之后,需要指派员工在那个部门工作
//人员信息有: 姓名 年龄 电话 工资等组成
//通过Multimap进行信息的插入 保存 显示
//分部门显示员工信息 显示全部员工信息
//multimap


//学生信息
class staff;
//查找信息
void seek(map<int, staff> &M, int i);
//打印信息
void myprint(map<int, staff> &m);
//输入信息
void insermes(map<int, staff> &M);
//删除信息
void deletemes(map<int, staff> &M, int ID);

//学生信息
class staff
{
public:
    staff(){};

    void setname(string name)
    {
        this->name = name;
    }
    void setage(int age)
    {
        this->age = age;
    }
    void setpone(long long pone)
    {
        this->pone = pone;    
    }
    void setwage(int wage)
    {
        this->wage = wage;
    }

    staff(string name, int age, long long pone, int wage)
    {
        this->name = name;
        this->age = age;
        this->pone = pone;
        this->wage = wage;
    }

    string name;
    int age;
    long long pone;
    int wage;
};

//打印信息
void myprint(map<int, staff> &m)
{
    for (map<int, staff>::iterator it=m.begin(); it != m.end(); ++it)
    {
        cout << "ID:" << it->first << " 姓名:" << it->second.name <<
            " 电话:" << it->second.pone << " 年龄:" << it->second.age <<
            " 工资:" << it->second.wage << endl;
    }
}

//输入信息
void insermes(map<int, staff> &M)
{
    
    int i = 1;
    int over = 1;
    cout << "结束输入请输入0" << endl;
    while (over)
    {
        //int ID;
        string name;
        long long pone;
        int wage;
        int age;
        //cout << "请输入学生编号:";
        //cin >> ID;
        //cout << endl;
        
        cout << "请输入学生姓名:";
        cin >> name;

        cout << "请输入学生年龄:";
        cin >> age;
        if (age < 0 || age>200)
        {
            continue;
        }
        
        cout << "请输入电话:";
        cin >> pone;
    
        cout << "请输入工资:";
        cin >> wage;
        cout << "你输入的是" << " 姓名:" << name << " 电话:" << pone <<
            " 年龄:" << age << " 工资:"<<wage<<endl;
        //staff(string name, int age, long long pone, int wage)
        staff p1;
        p1.setname(name);
        p1.setage(age);
        p1.setpone(pone);
        p1.setwage(wage);
        M.insert(make_pair(i, p1));
            ++i;
            cin >> over;
            if (over == 0)
            {
                over = 0;
            }
            else
            {
                over = 1;
            }
    }
}

//查找信息
void seek(map<int, staff> &M,int i)
{
    if (M.find(i) != M.end())
    {
        cout << "找到" << endl;

        if (M.find(i) != M.end())
        {
            cout << "ID:" << M.find(i)->first << " 姓名:" << M.find(i)->second.name <<
                " 电话:" << M.find(i)->second.pone << " 年龄:" << M.find(i)->second.age <<
                " 工资:" << M.find(i)->second.wage<< endl;
        }        
    }
}

//删除信息
void deletemes(map<int, staff> &M,int ID)
{
    M.erase(ID);
}

void test01()
{
    map<int, staff> M;
    insermes(M);
    myprint(M);
    seek(M, 2);
    deletemes(M, 2);
    myprint(M);
}

int main(){
    //test();
    test01();
    system("pause");
    return EXIT_SUCCESS;
}

 

posted @ 2020-06-15 11:45  AI_ON  阅读(122)  评论(0)    收藏  举报