C++ map容器 学习总结

-----------------------------------------------map/multimap容器

map/multimap特性

 map相对于set区别,map具有键值和实值,所有元素根据键值自动排序

pair的第一元素被称为键值,第二元素被称为实值

 map也是以红黑树作为底层实现机制

同时map与set类似 不能进行迭代器修改键值,但是可以改变实值

而map和multimap区别在于,map不允许相同key值存在,multimap则允许相同的key值存在

-------------map常用API

map构造函数

  map mapTT;  map默认构造函数

  map(const map& mp); 拷贝构造函数

map赋值操作

 map& operator= (const map& mp); 重载=操作符

 swap(mp);   交换两个集合容器

map大小操作

 size(); 返回容器元素个数

 empty();    判断容器是否为空

map插入数据元素操作

 map.insert(...);    往容器里插入元素,并返回pair

 map mapStu;

     //第一种 通过pair方式插入对象

 mapStu.insert(pair(3,"小张"));

     //第二种 通过pair方式插入对象

 mapStu.insert(make_pair(-1,"小张"));

     //第三种 通过value_type的方式插入独享

 mapStu.insert(map::value_type(1,"小张"));

     //第四种 通过数组方式进行插入

 mapStu[3] = "小张";

 mapStu[5] = "小李";

 PS:

     1、前三种方法,采用的是insert()方法,该方法返回值为pair

     2、第四种方法很直观,但存在一个性能问题:插入3时,先在mapStu中查找主键为3的项,若没发现,则将一个键为3

 ,值为初始化的对组插入到mapStu当中,然后再将值修改成"小张",若发现存在3这个键,则修改这个键对应的value

     3、string strName = mapStu[2];  ......取操作和插入操作

        只有当mapStu存在2这个键的时候才是正确的取操作,否则将会自动插入一个实例,键为2,值为初始值!!

map删除操作

 clear();    清空

 erase(pos); 删除迭代器所指向元素,返回下一个元素迭代器

 earse(beg,end); 删除区间所有元素,返回下一个元素的迭代器

 earse(key); 删除容器中值为key的元素

map查找和统计

 find(key);  查找key是否存在,若存在,返回该键的元素迭代器,若不存在,返回set.end()

 count(key); 统计key元素个数(对于map,返回1、0)

 lower_bound(keyElem); 返回第一个key>=keyElem的迭代器

 upper_bound(keyElem); 返回第一个key>keyElem的迭代器

 equal_range(keyElem); 返回容器中key与keyElem想的的上下限的两个迭代器

map排序

 1、默认根据key值小->大排序

 2、利用仿函数,自定义排序原则(同set)

class cmp {

public:

    bool operator() (int v1,int v2) {

        return v1 > v2;

    }

}

map::iterator 

 利用迭代器遍历

 it->first,it->second

 或(*it).first,(*it).second

#include
#include
using namespace std;

void test01 () {
    //第一个参数key类型,第二个参数value类型
    map mp;
    //插入数据 pair.first key值  pair.second value值
    //第一种
    pair::iterator,bool> ret = mp.insert(pair(10,10));
    if (ret.second) {
        cout << "插入成功!" << endl;
    }
    else {
        cout << "插入失败!" << endl;
    }
    ret = mp.insert(pair(10,20));
    if (ret.second) {
        cout << "插入成功!" << endl;
    }
    else {
        cout << "插入失败!" << endl;
    }
    //第二种
    mp.insert(make_pair(20,20));
    //第三种
    mp.insert(map::value_type(30,30));
    //第四种
    mp[40] = 40;    //若key不存在创建 若存在则修改
    mp[10] = 20;
    //打印
    for (map::iterator it = mp.begin();it != mp.end();it ++) {
        cout << "key: " << it->first << " value: " << it->second << endl;
    }
    cout << "mp[60]: " << mp[60] << endl;
    for (map::iterator it = mp.begin();it != mp.end();it ++) {
        cout << "key: " << it->first << " value: " << it->second << endl;
    }
    //若访问一个key不存在的数据,map将这个访问的key插入到容器,并将value置为默认值

}

你可能感兴趣的:(C++STL,c++,容器,算法,map)