C++ map相关操作

这篇博客探讨了两个C++编程问题:一是如何删除map中value为大写字母的元素,二是如何计算map中每个key对应成绩的平均数。在删除元素时,博客强调了迭代器在删除后会失效,需要在删除前递增。在计算平均数时,博客展示了如何使用unordered_map存储和处理数据,最后计算并输出学生各科目的平均分数。

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

1.删除value是大写的map

#include<bits/stdc++.h>
using namespace std;

//当我们删除了 it_pos 之后,it_pos 这个迭代器已经失效了,对其进行 it_pos++ 操作,
//就是未知的操作,会引起异常。所以我们应该在删除 it_pos 之前就对其进行 ++。改成下面的代码就可以解决问题了。
//c++ 11 之后,删除迭代器会返回指向下一个位置的迭代器
void erase_upper(std::map<int, char>& m) {
	map<int ,char>::iterator m1_Iter;

    for( m1_Iter = m.begin(); m1_Iter!=m.end();  ){
        if( m1_Iter->second >= 'A' && m1_Iter->second <= 'Z' ){
            m1_Iter = m.erase(m1_Iter);
            //m.erase(m1_Iter++);
        }else{
            m1_Iter++;
        }
    }

    map<int ,char>::iterator m2_Iter;
    for( m2_Iter = m.begin(); m2_Iter != m.end(); m2_Iter++ ){
        cout<<m2_Iter->second;
    }
}

int main()
{
    map<int, char> m  ;
    m[1] = 'a';
    m[2] = 'B
<think>好的,用户想了解C++map的使用方法和常见操作示例。首先,我需要回忆一下C++ map的基本概念。map是STL中的一个关联容器,存储键值对,并且按键自动排序。用户可能需要知道如何初始化、插入元素、遍历、查找和删除元素等常见操作。 根据提供的引用内容,引用[1]提到了map的迭代器类型,比如const_iterator和普通iterator的区别,以及在不同map类型下的返回情况。引用[2]则给出了构造map和插入元素的几种方法,比如使用operator[]、insert和make_pair。这些信息应该整合到回答中,确保用户清楚不同的插入方式及其适用场景。 接下来,我需要组织回答的结构。首先介绍map的基本概念,然后分点说明常用操作,如初始化、插入、遍历、查找、删除等,每个部分都要给出示例代码,并引用对应的参考资料。同时,需要注意用户提到的格式要求,比如行内公式用$...$,独立公式单独成段,但这里可能用不到数学公式,主要是代码示例。 需要注意用户可能对const_iterator和普通iterator的区别不太清楚,需要解释清楚,特别是在const map中的使用限制,如不能修改值。另外,插入操作的几种方法,比如使用insert和operator[]的区别,比如当键已存在时的不同行为,这也是常见的问题点。 还要考虑用户的实际应用场景,比如如何高效地遍历map,如何安全地查找元素避免未找到的情况,删除元素的正确方法等。这些问题都需要在示例中体现,并给出最佳实践的建议。 最后,生成相关问题,这些问题应该围绕用户可能进一步想了解的内容,比如性能分析、底层实现原理、与其他容器的比较等,这样可以帮助用户深入学习和解决问题。</think>### C++ map 使用方法及常见操作示例 C++ 中的 `map` 是标准模板库(STL)提供的关联容器,基于红黑树实现,用于存储键值对(key-value pairs),并按键自动升序排列。以下为常用操作及示例: --- #### 1. **初始化与插入元素** - **初始化**:需指定键和值的类型,例如 `map<int, string>`。 - **插入方法**: 1. 使用 `operator[]` 直接赋值(若键存在则覆盖值)[^2]。 2. 使用 `insert` 函数配合 `pair` 或 `make_pair`(若键存在则插入失败)。 ```cpp #include <map> using namespace std; map<int, string> stuMap; stuMap[1001] = "Jason"; // 方法1 stuMap.insert(pair<int, string>(1002, "Helen")); // 方法2 stuMap.insert(make_pair(1003, "Steve")); // 方法3 ``` --- #### 2. **遍历元素** 使用迭代器遍历,注意 `begin()` 和 `end()` 返回的迭代器类型(`iterator` 或 `const_iterator`)取决于 `map` 是否为 `const`[^1]。 ```cpp for (auto it = stuMap.begin(); it != stuMap.end(); ++it) { cout << "学号:" << it->first << " 姓名:" << it->second << endl; } // 或使用 C++11 范围循环 for (const auto& pair : stuMap) { cout << "学号:" << pair.first << " 姓名:" << pair.second << endl; } ``` --- #### 3. **查找元素** - **`find()` 函数**:返回指向键的迭代器,未找到则返回 `end()`。 - **`count()` 函数**:返回键是否存在(0或1)。 ```cpp auto it = stuMap.find(1002); if (it != stuMap.end()) { cout << "找到学生:" << it->second << endl; } if (stuMap.count(1004) == 0) { cout << "学号1004不存在" << endl; } ``` --- #### 4. **删除元素** - **`erase()` 函数**:可通过键或迭代器删除。 ```cpp stuMap.erase(1001); // 按键删除 auto it = stuMap.find(1002); if (it != stuMap.end()) { stuMap.erase(it); // 按迭代器删除 } ``` --- #### 5. **其他操作** - **获取大小**:`stuMap.size()` - **清空容器**:`stuMap.clear()` - **判断是否为空**:`stuMap.empty()` --- ### 关键注意事项 1. **键的唯一性**:每个键在 `map` 中唯一,重复插入会失败(`insert`)或覆盖(`operator[]`)。 2. **迭代器类型**:对 `const map` 使用 `begin()` 会返回 `const_iterator`,禁止修改值。 3. **性能特点**:查找、插入、删除操作的时间复杂度为 $O(\log n)$,适合需要有序键的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值