Map常用操作——插入、查找、删除、遍历

本文详细介绍了C++ STL中Map容器的四种插入方法、三种查找方式、四种删除操作及遍历技巧。深入探讨了每种操作的特点及应用场景,帮助读者全面掌握Map的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Map常用操作——插入、查找、删除、遍历

1. 插入

四种插入方法
方法一:pair

map<int, int> mp;
mp.insert(pair<int,int>(1, 2));

方法二:make_pair

map<int, int> mp;
mp.insert(make_pair<int,int>(2,3));

方法三:value_type

map<int, int> mp;
mp.insert(map<int, int>::value_type(3,4));

方法四:[]

map<int, int> mp;
mp[4] = 5;

四种方法异同:
前三种方法当出现重复键时,编译器会报错,有的可能不会报错但是会忽视重复键插入,而第四种方法,当键重复时,会覆盖掉之前的键值对。

2. 查找

方法一:[]

map<int, int> mp;
cout << mp[1] << endl;
Mp[1] = 2;
cout << mp[1] << endl;

第一句输出为0,第二句输出为2.
下标索引的机制:用下标访问map中不存在的元素时,将导致向map中添加该下标所指向的新元素,其值会根据类型默认值或默认构造函数进行初始化。
方法二:map.at()

map<int, int> mp;
map[1] = 0;
cout << mp.at(1) << endl;
cout << mp.at(2) << endl;

第一句输出为0,第二句抛出异常。.
at函数机制:存在则正常输出,不存在返回map.end().
方法三:count()和find()

map<int,int> mp;
    mp[1] = 1;
     map<int, int>::iterator iter=mp.find(1);
     if(iter != mp.end()){
          cout<<"Found, the value is "<<iter->second<<endl;
     }else{
          cout<<"Do not found"<<endl;
    }

map::find(k),如果map中存在按k索引的元素,则返回指向该元素的iterator;如果不存在则返回end()。
map::count(k),返回map中k出现的次数,为0当然就表示不存在,只能用来判断k是否存在。

3. 删除

map定义了四个删除元素的方法

iterator erase(iterator it); //通过一个条目对象删除
iterator erase(iterator first, iterator last);//删除范围[first, last)内对象
size_type erase(const Key& key); //通过关键字删除
map的清空函数clear()就相当于 Map.erase(Map.begin(), Map.end());

4. 遍历

前序遍历 [ begin(), end() )

map<int, int> mp;
for (map<int, int>::iterator iter = mp.begin(); iter != mp.end(); iter ++)
    cout << mp->first << " " << mp->second << endl;

后序遍历 [ rbegin(), rend() )

map<int,string> mp;
for (map<int, int>::iterator iter = mp.rbegin(); iter != mp.rend(); iter ++)
    cout << mp->first << " " << mp->second << endl;
### C++ 中 `map` 的常用操作方法 #### 1. 插入键值对 可以通过直接赋值的方式向 `map` 中插入新的键值对。如果键已经存在,则会更新其对应的值。 ```cpp #include <iostream> #include <map> int main() { std::map<int, std::string> myMap; myMap[1] = "Apple"; // 插入键值对 (1, "Apple") myMap.insert({2, "Banana"}); // 使用 insert 函数插入键值对 (2, "Banana") for (const auto& pair : myMap) { std::cout << pair.first << ": " << pair.second << "\n"; } } ``` 上述代码展示了两种插入方式:通过下标运算符 `[key]` 成员函数 `insert()`[^3]。 --- #### 2. 访问元素 要访问 `map` 中的某个特定键所关联的值,可以直接使用下标运算符或者 `at()` 成员函数。需要注意的是,当使用下标运算符时,如果指定的键不存在于 `map` 中,将会自动创建该键并赋予默认值(对于内置类型,默认值通常为零)。而 `at()` 则会在找不到对应键的情况下抛出异常。 ```cpp std::map<std::string, int> fruitCount; fruitCount["Apple"] = 5; // 下标运算符访问 if (fruitCount.count("Apple")) { // count 检查是否存在键 std::cout << "Number of Apples: " << fruitCount["Apple"] << "\n"; } // at() 方法访问 try { std::cout << "Number of Bananas: " << fruitCount.at("Banana") << "\n"; } catch(const std::out_of_range& e){ std::cerr << "Key not found\n"; } ``` 这里提到的方法包括 `count()` 来检测某键的存在状态以及如何安全地利用 `at()` 获取值。 --- #### 3. 遍历所有元素 为了逐一查看 `map` 内部存储的所有键值组合,可以借助迭代器完成这一过程。下面给出了一种典型的循环模式: ```cpp for(auto const& element : myMap){ std::cout << "{" << element.first << ", " << element.second << "}\n"; } ``` 另外一种基于传统风格的实现如下所示: ```cpp std::map<char, int>::iterator it; for(it=myMap.begin(); it !=myMap.end(); ++it){ std::cout << (*it).first << "->" << (*it).second << "\n"; } ``` 这两种形式均能有效地枚举整个容器中的条目。 --- #### 4. 删除元素 删除单个或多个项可通过调用 erase 方法来达成目的。此功能支持三种不同的参数形式——具体位置、单独标识符还有范围区间。 ```cpp myMap.erase('a'); // 移除 key='a' 的记录 myMap.erase(myMap.find('b')); // 根据返回的位置移除 b 对应的内容 myMap.erase(myMap.begin(), myMap.upper_bound('d')); // 清理从起始到 d 所有项目 ``` 以上片段说明了不同场景下的清除动作。 --- #### 5. 查找元素 查找特定键是否存在于当前映射之中可依赖 find 或者 equal_range 等工具辅助判断。 ```cpp auto searchResult = myMap.find('f'); if(searchResult != myMap.end()){ std::cout << "Found f with value:" << searchResult->second << "\n"; }else{ std::cout << "'f' does not exist.\n"; } ``` 这段程序演示了怎样定位目标对象及其后续处理逻辑。 --- ### 性质补充 值得注意的一点是,在标准库实现里头,`map` 底层采用平衡二叉搜索树(通常是红黑树),这意味着它的内部节点总是维持着某种顺序排列特性,从而保证基本操作的时间复杂度稳定保持在 O(log n)[^5]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值