C++ STL中map的用法及统计数组各个元素出现的次数

博客介绍了C++中map的基本用法,包括变量声明、插入元素、查找元素、删除或清空等操作,还提及利用map统计数组或向量中各元素出现的次数,属于信息技术领域的C++编程知识。
map的基本用法
  1. 变量声明
map<string ,string> m; //可以使任意类型,包括自定义类型
  1. 插入元素
m.insert(pair<string,string>("key","value"));
  1. 查找元素
iter = m.find("key");

if(iter != m.end())
       cout<<"Find, the value is"<<iter->second<<endl;
else
   cout<<"Do not Find"<<endl;
  1. 删除或者清空
//用关鍵字刪除
int n = m.erase("key");//如果刪除了会返回1,否則返回0

//用迭代器范围刪除 : 把整个map清空
m.erase(m.begin(), m.end());
//等同于m.clear()
统计数组(或者向量)中各元素出现的次数
#include <map>
int main(void)
{
    int i;
    int a[] = { 1, 2, 3, 4, 5, 5, 5 };
    map<int, int> m;
    for (i = 0; i < 7; i++)
    {
        if (m.end() != m.find(a[i])) m[a[i]]++;
        else m.insert(pair<int, int>(a[i], 1));
    }
    for (auto it : m)
    {
        cout << it.first << ends << it.second << endl;
    }
    return 0;
}
<think>好的,我现在需要帮助用户了解C++ STLMap的使用方法和示例。首先,我应该回顾一下自己关于STL Map的知识,确保信息的准确性。根据用户提供的引用,特别是引用[2]、[3]、[4]和[5],Map是一个关联容器,处理键对,支持自定义类型,并且有erase等成员函数。 首先,我应该介绍Map的基本概念,比如它的特性,如键唯一性、自动排序等。然后,可能需要分点说明如何创建和初始化Map,插入元素,访问元素,遍历,删除元素,查找元素,容量查询以及自定义排序规则。每个部分需要给出示例代码,比如使用insert或emplace添加元素,使用operator[]或at访问元素,迭代器遍历,erase删除元素,find函数查找等。 接下来,要考虑到用户可能需要实际应用的例子,比如统计单词出现次数,这样能展示Map的实际用途。同时,用户提到自定义排序规则,这里需要说明如何通过重载运算符或提供比较函数来实现,引用[3]中提到了重载<运算符,这点很重要。 另外,用户提供的引用[5]中有关于erase的使用示例,应该注意在循环中删除元素时正确使用迭代器,避免失效。这部分需要详细说明,可能给出示例代码,如使用erase返回下一个有效的迭代器。 还需要注意问题可能涉及性能,比如unordered_mapmap的区别,但用户的问题主要集中在map上,所以可能简要提及,如引用[4]中提到的不同Map变种,但主要回答map的基本用法。 最后,生成相关问题,确保覆盖常见疑问,比如与其它容器的区别、底层实现、性能优化等。同时,检查是否所有LaTeX公式都正确使用$...$或$$...$$格式,代码块使用正确语法,引用标识正确添加。 现在需要组织这些内容,确保结构清晰,步骤明确,每个部分都有代码示例,并正确引用提供的资料。同时,检查是否有遗漏的重要点,如自定义类型的键、multimap的差异等,但根据用户问题,可能集中在基本map的使用上,其他变种可以放在相关问题中提及。</think>### C++ STL Map 使用方法及示例 #### 1. Map 基本特性 - **关联容器**:存储键对(`key-value`),键唯一且自动排序(默认按升序)[^2]。 - **底层实现**:通常基于红黑树,插入/查找时间复杂度为 $O(\log n)$[^4]。 - **适用场景**:需要快速根据键查找的场景,如字典、计数器等。 --- #### 2. 基本操作与示例代码 ##### (1) 创建与初始化 ```cpp #include <map> // 默认按键升序排序 std::map<int, std::string> mp1; // 自定义排序规则(按键降序) std::map<int, double, std::greater<int>> mp2; ``` ##### (2) 插入元素 - 使用 `insert` 或 `emplace`: ```cpp mp1.insert(std::make_pair(1, "Apple")); mp1.emplace(2, "Banana"); // 更高效,避免临时对象创建 mp1[3] = "Cherry"; // 类似数组 ``` ##### (3) 访问元素 - 通过 `operator[]` 或 `at`: ```cpp std::cout << mp1[1]; // 输出 "Apple"(若键不存在会创建默认) std::cout << mp1.at(2); // 输出 "Banana"(键不存在抛出异常) ``` ##### (4) 遍历元素 - 使用迭代器: ```cpp for (auto it = mp1.begin(); it != mp1.end(); ++it) { std::cout << "Key: " << it->first << ", Value: " << it->second << std::endl; } ``` ##### (5) 删除元素 - `erase` 用法示例(注意迭代器失效问题)[^5]: ```cpp auto it = mp1.find(2); if (it != mp1.end()) { mp1.erase(it); // 删除指定位置的元素 } mp1.erase(3); // 删除键为3的元素 // 循环中安全删除 for (auto it = mp1.begin(); it != mp1.end(); ) { if (it->first == 1) { it = mp1.erase(it); // erase返回下一个有效迭代器 } else { ++it; } } ``` ##### (6) 查找与判断存在性 - 使用 `find` 或 `count`: ```cpp if (mp1.find(2) != mp1.end()) { std::cout << "键2存在"; } if (mp1.count(3) > 0) { // 返回0或1(Map键唯一) std::cout << "键3存在"; } ``` ##### (7) 容量查询 - `size()` 和 `empty()`: ```cpp if (!mp1.empty()) { std::cout << "元素数量:" << mp1.size(); } ``` --- #### 3. 自定义类型作为键 若键是自定义类型(如结构体),需**重载 `<` 运算符**或提供**比较函数对象**[^3]: ```cpp struct Point { int x, y; bool operator<(const Point& p) const { // 必须为const成员函数 return (x < p.x) || (x == p.x && y < p.y); } }; std::map<Point, std::string> point_map; ``` --- #### 4. 实际应用示例 **统计单词出现次数**: ```cpp std::map<std::string, int> word_count; std::string word; while (std::cin >> word) { ++word_count[word]; // 若单词不存在,会自动插入并初始化为0 } // 输出结果 for (const auto& pair : word_count) { std::cout << pair.first << ": " << pair.second << "次\n"; } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值