STL map 基本使用方法

map 和 multimap (映射和多重映射)

Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。map 内部自建一颗红黑树(一种非严格意义上的平衡二叉树)。

红黑树

基本用法

1. 定义迭代器 map

构造函数
+ map<string , int >mapstring;
+ map<int ,string >mapint;
+ map<sring, char>mapstring;
+ map<char ,string>mapchar;
+ map<char ,int>mapchar;
+ map<int ,char >mapint;

map<int, int> m;
map<int, int>::const_iterator iter;

// 根据键升序排列
map<less<int>, int> mLess;
// 根据键降序排列(默认)
map<greater<int>, int> mGreater;
2. 插入数据
/**
* 注意,如果插入重复键,不会覆盖先前数据,当前操作会被忽略,所以需要先判断 map 中是否已经存在当前键。
**/

// 不推荐
m[i] = 'a'+i;

m.insert(pair<int, char>(10, 'z'));

m.insert(map<int, char>::value_type (11, 'x'));

m.insert(make_pair(1, 6));
3. 查找指定键对应的节点
/**
 * 1. 没有寻找到相关节点时,iter 指向末尾
**/
iter = m.find("key");
cout<<"key: "<<iter->first<<","<<"value: "<<iter->second;
4. 删除相应的节点
  • iterator erase(iterator it); //通过一个条目对象删除
  • iterator erase(iterator first, iterator last); //删除一个范围
  • size_type erase(const Key& key); //通过关键字删除
  • clear() // 清空
iter = m.find(1);
// 此时,iter 指向被删除的节点,需要及时更新 iter
m.erase(iter->first);
5. 其他使用
  1. swap()

    交换两个 map 容器的内容

    // 1. 二者交换
    m1.swap( m2 );
    swap( m1, m3 );
    // 2. 复制
    m1 = m2;
    
  2. size()

    计算容器大小

  3. find()

    查找制定键第一次出现的位置

  4. 相邻位置

    // 查找第一个 <e 的位置
    lower_bound(e);
    // 查找第一个 >e 的位置
    upper_bound(e);
    

部分用法示例代码

#include<iostream>
#include<map>

using namespace std;

int main()
{
    map<int,char> m;
    map<int,char>::const_iterator iter;

    for(int i=0;i<10;i++){
        m[i] = 'a'+i;
    }

    iter = m.begin();
    while( iter != m.end() )
    {
        cout<<iter->first<<" "<<iter->second<<endl;
        iter++;
    }

    iter = m.begin(); // 获取平衡树最左下角(most left)的节点
    cout<<"min: "<<iter->first<<","<<iter->second<<endl; // 最小节点的 key 和 value
    // cout<<"min: "<<(*iter).first<<","<<(*iter).second<<endl;

    iter = m.end(); // 获取平衡树最右下角落(most right)的节点的后一位!
    iter--;
    cout<<"max "<<iter->first<<","<<iter->second<<endl; //最大的 key 和 value

    return 0;
}

multimap 用法

  • multimap 特性以及用法与 map 相同
  • multimap 允许重复键值的元素
  • 键值 key 与元素 value 为多对多映射关系
  • 没有定义 [] 操作运算
  • 使用 multimap 必须使用宏语句 #include <map>