【C++】STL中Map常见用法和示例

Map用法中文参考手册:https://zh.cppreference.com/w/cpp/container/map

1. 头文件 < map >

2. map是什么

2.1 原理
  • std::map是有序键值对容器,它的元素的键是唯一的
  • 实现方式通常为红黑树
  • 用比较函数Compare排序键
2.2 复杂度
  • 插入: O(logn)
  • 删除: O(logn)
  • 查找: O(logn)

3. 常用函数

3.1 元素访问
元素访问作用
operator[]访问或插入指定的元素
    map<string, int> m;
    m = {{"aaa", 1}, {"bbb", 2}, {"ccc", 3}}; // 赋值
    // 时间复杂度通常为O(nlogn),如果已排序则为O(n)

    cout<<m["aaa"]<<endl;  // 结果是 1
    m["aaa"] = 4; // 更新值
    m["ddd"] = 5; // 插入值

    for(auto &pair : m) // 输出结果
    {
        cout<<pair.first<<" : "<<pair.second<<endl;
    }
3.2 迭代器
迭代器作用
begin返回指向容器第一个元素的迭代器
end返回指向容器尾端的迭代器
rbegin返回指向容器最后元素的逆向迭代器
rend返回指向前端的逆向迭代器
    map<string, int> m2 = m;
    map<string, int>::iterator iter; // 正向迭代器
    map<string, int>::reverse_iterator riter; // 逆向迭代器
    
    for(iter=m2.begin(); iter!=m2.end(); iter++){
        cout<<iter->first<<" : "<<iter->second<<endl;
    } // 正向迭代器输出结果, 这里iter是指针变量

    for(riter=m2.rbegin(); riter!=m2.rend(); riter++){
        cout<<riter->first<<" : "<<riter->second<<endl;
    } // 逆向迭代器输出结果, 这里riter是指针变量
3.3 容量函数
容量函数作用
empty检查容器是否为空
size返回容纳的元素数
max_size返回可容纳的最大元素数
    cout<<m2.empty()<<endl; // 结果是 0
    cout<<m2.size()<<endl;  // 结果是4
    cout<<m2.max_size()<<endl; // 可容纳的最大元素数,不同计算机结果可能不同
3.4 修改函数
修改函数作用
clear清除内容
erase擦除元素
    m2["ddd"] = 5; // 直接增加
    m2["aaa"] = 10; // 直接更新
    for(auto &pair : m2){
        cout<<pair.first<<" : "<<pair.second<<endl;
    }

    m2.erase("ddd"); // 擦除"ddd"
    for(auto &pair : m2){
        cout<<pair.first<<" : "<<pair.second<<endl;
    }
3.5 查找函数
查找作用
count返回匹配特定键的元素数量
find寻找带有特定键的元素
    cout<<m2.count("aaa")<<endl; // 因为容器不允许键重复,所以结果为1或0
    map<string, int>::iterator sear;
    sear = m2.find("aaa");

    if(sear != m2.end()){
        cout<< "Found. "<< sear->first<<" : "<< sear->second<<endl;
    }else{
        cout<<"Not found."<<endl;
    }

4.常用示例

4.1 单词计数器
    list<string> word = {"hello", "world", "c", "hello", "c++",
                        "world", "hello", "hello"}; // 单词列表
    map<string, size_t> word_map;
    for(auto &n : word){ // 统计
        ++word_map[n];
    }

    for(auto &pair : word_map){ // 输出统计结果
        cout<<pair.first<<" : "<<pair.second<<endl;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值