C++map的详解和常用接口

在 C++ 中,map是一种关联容器,它存储的是键值对(key-value pairs),并且根据键(key)进行排序。map中的键是唯一的,而值可以根据需要重复。map内部通常使用红黑树实现,这使得插入、删除和查找操作都具有对数时间复杂度O(logn)。

1. 头文件

使用map需要包含<map>头文件:

#include <map>

2. 定义和初始化

  • 定义一个空的map
std::map<int, std::string> myMap;

这里定义了一个map,键的类型是int,值的类型是std::string

  • 初始化map
std::map<int, std::string> myMap = {
    {1, "one"},
    {2, "two"},
    {3, "three"}
};

3. 常用接口

插入元素
  • 使用insert方法
myMap.insert(std::make_pair(4, "four"));
// 或者使用花括号初始化列表
myMap.insert({5, "five"});
  • 使用operator[]
myMap[6] = "six";

operator[]在插入元素时,如果键不存在,会自动创建一个新的键值对;如果键已存在,会更新对应的值。

访问元素
  • 使用at方法
std::string value = myMap.at(2);

at方法会检查键是否存在,如果不存在会抛出std::out_of_range异常。

  • 使用operator[]
std::string value2 = myMap[2];

operator[]如果键不存在,会插入一个默认值的键值对。因此,operator[]不适合用于只读访问。

查找元素
  • 使用find方法
auto it = myMap.find(3);
if (it!= myMap.end()) {
    std::cout << "Found key 3 with value: " << it->second << std::endl;
}

find方法返回一个迭代器,指向找到的键值对;如果没有找到,返回mapend()迭代器。

删除元素
  • 使用erase方法
// 根据键删除
myMap.erase(4);
// 根据迭代器删除
auto it2 = myMap.find(5);
if (it2!= myMap.end()) {
    myMap.erase(it2);
}
获取大小
  • 使用size方法
size_t mapSize = myMap.size();
检查是否为空
  • 使用empty方法
bool isEmpty = myMap.empty();
遍历map
  • 使用范围for循环
for (const auto& pair : myMap) {
    std::cout << pair.first << ": " << pair.second << std::endl;
}
  • 使用迭代器
for (auto it = myMap.begin(); it!= myMap.end(); ++it) {
    std::cout << it->first << ": " << it->second << std::endl;
}

示例代码

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

int main() {
    std::map<int, std::string> myMap = {
        {1, "one"},
        {2, "two"},
        {3, "three"}
    };

    // 插入元素
    myMap.insert({4, "four"});
    myMap[5] = "five";

    // 访问元素
    std::cout << "Value of key 2: " << myMap.at(2) << std::endl;
    std::cout << "Value of key 3: " << myMap[3] << std::endl;

    // 查找元素
    auto it = myMap.find(4);
    if (it!= myMap.end()) {
        std::cout << "Found key 4 with value: " << it->second << std::endl;
    }

    // 删除元素
    myMap.erase(5);

    // 遍历map
    std::cout << "Contents of map:" << std::endl;
    for (const auto& pair : myMap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    // 获取大小
    std::cout << "Size of map: " << myMap.size() << std::endl;

    // 检查是否为空
    std::cout << "Is map empty? " << (myMap.empty()? "Yes" : "No") << std::endl;

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值