STL-map

9 篇文章 0 订阅

目录

1.包含头文件

2.map的创建与初始化

 3.元素访问

4.插入与删除


1.包含<map>头文件

#include<map>

2.map的创建与初始化

  • map<T keyType, T valueType> m:创建一个键为 keyType 类型,值为 valueType 类型的空 map
  • map<T keyType, T valueType> m {pair_1, pair_2,  ..., pair_i}:创建并使用 i 个 pair 初始化 map,pair 类型与 map 一致
  • map<T keyType, T valueType> m {another_map}:拷贝一个 map,类型要一致
  • map<T keyType, T valueType> m {begin, end}:使用一个类型一致的 map 的迭代器创建并初始化 map
#include<iostream>
#include<map>
#include<string>

using namespace std;

int main()
{
    map<string, int> nameToAge;  // 创建一个空的 map

    pair<string, int> info1 = make_pair("fujh", 20);
    pair<string, int> info2 = make_pair("fujy", 19);
    map<string, int> nameToAge1 {info1, info2};  // 使用 pair 初始化 map

    // 也可以直接以如下方式使用,效果同上
    map<string, int> nameToAge2 {make_pair("fujh", 20), make_pair("fujy", 19)};
    map<string, int> nameToAge3 {{"fujh", 20}, {"fujy", 19}};

    // 拷贝 map
    map<string, int> nameToAge4 = nameToAge2;
    map<string, int> nameToAge5 {nameToAge2};

    // 使用迭代器初始化
    map<string, int> nameToAge6 {nameToAge3.begin(), nameToAge3.end()};

    return 0;
}

 3.元素访问

  • [ ] 下标访问
  • at() 函数访问

两者的区别为:[ ] 访问不存在元素不会报错,访问仍然成功,取得value对象默认构造的值;而at() 会产生错误,阻止该访问

#include<iostream>
#include<map>
#include<string>

using namespace std;

int main()
{
    map<string, int> nameToAge {{"fujh", 20}, {"fujy", 19}};

    cout << nameToAge["fujh"] << endl;  // 20
    cout << nameToAge.at("fujy") << endl;  // 19

    return 0;
}

4.插入与删除

  • insert():插入元素,不能插入与原有的键一样的值
  • emplace():构造并插入元素,不能插入与原有的键一样的值
  • erase():删除元素
  • clear():清空
#include<iostream>
#include<map>
#include<string>

using namespace std;

void showMap(const map<string, int> &m)
{
    for(pair<string, int> p : m)
    {
        cout << "name: " << p.first << '\t';
        cout << "age: " << p.second << endl;
    }
}

int main()
{
    map<string, int> nameToAge {{"fujh", 20}, {"fujy", 19}};
    showMap(nameToAge);
    /*name: fujh      age: 20
     *name: fujy      age: 19
     */

    map<string, int> name2age {{"aaaa", 11}, {"bbbb", 12}};

    // insert 插入一个元素
    nameToAge.insert({"cccc", 13});  // 也可以如下
    // nameToAge.insert(make_pair("cccc", 13))  // 插入一个 pair
    // pair<string, int> p = make_pair("cccc", 13);
    // nameToAge.insert(p);  // 插入一个 pair
    showMap(nameToAge);
    /*name: cccc      age: 13
     *name: fujh      age: 20
     *name: fujy      age: 19
     */

    // insert 使用迭代器插入多个
    nameToAge.insert(name2age.begin(), name2age.end());
    // 同 nameToAge.insert({"aaaa", 11}, {"bbbb", 12})
    showMap(nameToAge);
    /*name: aaaa      age: 11
     *name: bbbb      age: 12
     *name: cccc      age: 13
     *name: fujh      age: 20
     *name: fujy      age: 19
     */

    // emplace 插入
    nameToAge.emplace("dddd", 14);
    showMap(nameToAge);
    /*name: aaaa      age: 11
     *name: bbbb      age: 12
     *name: cccc      age: 13
     *name: dddd      age: 14
     *name: fujh      age: 20
     *name: fujy      age: 19
     */

    // erase 删除
    nameToAge.erase("dddd");  // 返回值为删除的数目,因为 key 唯一,故返回值为 0/1
    showMap(nameToAge);
    /*name: aaaa      age: 11
     *name: bbbb      age: 12
     *name: cccc      age: 13
     *name: fujh      age: 20
     *name: fujy      age: 19
     */

    // erase 迭代器删除
    nameToAge.erase(begin(nameToAge));  // 返回下一个元素的迭代器
    showMap(nameToAge);
    /*name: bbbb      age: 12
     *name: cccc      age: 13
     *name: fujh      age: 20
     *name: fujy      age: 19
     */

    // erase 迭代器删除多个元素,左闭右开式删除
    auto iter = begin(nameToAge);
    advance(iter, 2);  // iter 前移 2 次
    nameToAge.erase(begin(nameToAge), iter);
    showMap(nameToAge);
    /*name: fujh      age: 20
     *name: fujy      age: 19
     */

    // 清空 map
    nameToAge.clear();
    cout << nameToAge.size() << endl;  // 0
    cout << (nameToAge.empty() ? "true" : "false") << endl;  // true
    return 0;
}

这里只记录了 map 的简单使用,对于 map 的更加详细的方面,如:底层组织等没有记录。

了解更多请参考:C++ map容器(STL map容器)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值