C++map类型

本文深入讲解C++标准库中的map容器。介绍了map的基本概念、定义、构造函数、迭代器及类型定义等内容。并通过实例展示了如何使用map进行元素的插入、查找和删除等操作。

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

map是键-值对的集合,可以理解为关联数组,可以使用键作为下标来获取一个值

 本文地址:http://www.cnblogs.com/archimedes/p/cpp-map.html,转载请注明源地址。

map对象的定义

使用前添加map头文件,必须分别指明键和值的类型:

map<string,int>word_count;

map的构造函数:

map<k,v>m;   创建一个名为m的空map对象,其键值类型分别为k和v

map<k,v>m(m2);   创建m2的副本m, m与m2必须有相同的键值类型

map<k,v>m(b,e);   创建map类型的对象,存储迭代器b和e标记的范围内所有元素的副本,元素的类型必须能转化为pair<const k,v>

map定义的类型

map对象的元素是键-值对,map的value_type反映了这样的事实,value_type是存储元素的键以及值的pair类型,而且键为const,比如word_count的类型为:

pair<const string, int>类型

map类定义的类型:

map<K,V>::key_type  在map容器中,用作索引的键的类型

map<K,V>::mapped_type  在map容器中,键所关联的值的类型

map<K,V>::value_type   一个pair类型,它的first元素具有const map<K,V>::key_type类型,而second元素则为map<K,V>::mapped_type类型

map迭代器进行解引用将产生pair类型的对象

map<string,int>::iterator map_it=word_count.begin();
cout<<map_it->first;
cout<<" "<<map_it->second;
map_it->first="new key" //error
++map_it->second

给map添加元素

使用insert成员实现或者先用下标操作符获取元素,然后给获取的元素赋值

使用下标访问map对象

map<string,int>woed_count;  //空map
word_count["Anna"]=1;     //插入默认的初始元素(键:Anna, 值:1)

map的下标也使用索引(就是键)来获取该键所关联的值,如果该键已在容器中,则map的下标运算行为相同,返回该键所关联的值。只有在所查找的键不存在的时候,map容器才为该键创建一个新的元素,并将它插入到此map对象中。

1、下标操作符返回值的使用

下标操作符返回的是左值,即使特定键所关联的值

cout<<word_count["Anna"];
++word_count["Anna"];
count<<word_count["Anna"];

2、下标行为的编程意义

如果下标所表示的键在容器中不在,则添加新元素,这一特性可使程序惊人的简练:

map<string, int>word_count;
string word;
while(cin>>word)
    ++word_count[word];

这段程序用来记录每个单词出现的次数

编程练习:编写程序统计并输出所读入的单词出现的次数

#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<utility>
using namespace std;
int main()
{
    map<string, int> word_count;
    string word;
    while(cin>>word)
        ++word_count[word];
    map<string, int>::iterator it;
    for(it=word_count.begin(); it!=word_count.end(); it++) 
        cout<<it->first<<":"<<it->second<<endl;
    return 0;
}

map::insert的使用

插入单个元素的insert版本使用键-值pair类型的参数,对于参数为一对迭代器的版本,迭代器必须指向键-值pair类型的元素

map容器的接受单个值的insert版本的返回类型

使用下标给map添加新元素,元素的值部分将采用值初始化,而插入元素的另一个方法是:直接使用insert成员,语法更紧凑:

word_count.insert(map<string,int>::value_type("Anna",1));

传递给insert的实参相当的笨拙,可以用两种方法简化:

使用make_pair

word_count.insert(make_pair("Anna",1));

或使用typedef:

typedef map<string, int>::value_type valtype;
word_count.insert(valtype("Anna", 1))

检测insert的返回值

 如果试图插入的元素所对应的键已经在容器中,则insert将不做任何操作,但是带有一个键-值pair形参的insert版本将返回一个值:包含一个迭代器和一个bool值的pair对象,其中迭代器指向map中具有相应键的元素,而bool值则表示是否插入了该元素

下面使用insert重写的单词统计程序:

#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<utility>
using namespace std;
int main()
{
    map<string, int> word_count;
    string word;
    while(cin>>word) {
        pair<map<string, int>::iterator, bool> ret=word_count.insert(make_pair(word,1));
        if(!ret.second)
            ++ret.first->second;
    }
    map<string, int>::iterator it;
    for(it=word_count.begin(); it!=word_count.end(); it++) 
        cout<<it->first<<":"<<it->second<<endl;
    return 0;
}

查找并读取map中的元素

下标操作符读取一个值会产生副作用,map容器提供了两个操作:count和find,用于检查某个键是否存在而不会插入该键

m.count(k)    返回m中k的出现次数

m.find(k)    如果m容器中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器

1、使用count检查map对象中某键是否存在

对于map对象,count成员的返回值只能是0或1,map容器只允许一个键对应一个实例,所有count可有效地表明一个键是否存在

map<string, int> word_count;
int occurs=0;
if(word_count.count("foo"))
    occurs=word_count["foo"];

2、读取元素而又不插入该元素

find操作返回指向元素的迭代器,如果元素不存在,则返回end迭代器

map<string, int> word_count;
int occurs=0;
map<string,int>::iterator it=word_count.find("foo");;
if(it!=word_count.end())
    occurs=it->second;

从map对象中删除元素

 

 

<think>好的,用户想了解C++map类型的find函数用法和示例。首先,我需要回忆一下C++ STL中map的基本知识。map是一个关联容器,以键值对的形式存储元素,并且根据键进行自动排序。find函数用于查找特定键是否存在。 接下来,我应该确认find函数的基本语法。根据引用[2],map的find函数接受一个键作为参数,返回一个迭代器。如果找到,指向该元素;否则返回end()迭代器。需要提醒用户检查返回值是否等于end()来判断是否找到。 然后,用户可能需要示例代码来理解具体用法。引用[1]中的std::find例子虽然来自vector,但可以对比说明map的find更直接使用成员函数。引用[2]中的示例应该更相关,可能需要调整代码格式,确保正确显示。例如,包含必要的头文件,比如<map>和<iostream>,以及using namespace std或者完全限定命名空间。 另外,用户提到的引用[3]中关于erase的用法,虽然不直接相关,但可能需要注意迭代器失效的问题。不过在find的上下文中,可能不需要深入讨论,但如果有相关问题可以提及。 需要确保回答符合用户的要求,结构清晰,分点说明。可能包括:函数作用、语法、返回值、示例代码、注意事项等。同时,根据用户提供的引用,特别是引用[2]的链接,应该引导用户参考更详细的资料。 还要检查是否需要处理多键的情况,但map的键是唯一的,所以find只会返回一个结果。如果是multimap,情况不同,但用户问的是map,所以不需要涉及。 最后,生成相关问题,可能涉及查找效率、与其他查找方法的对比、异常处理等。确保问题与主题相关,帮助用户深入理解。</think>### C++map类型的find函数用法详解 #### 1. 函数作用 `std::map::find()`用于在map容器中**查找指定键**是否存在。若存在,返回指向该键值对的迭代器;若不存在,返回`map.end()`[^2]。 #### 2. 基本语法 ```cpp iterator find (const key_type& k); const_iterator find (const key_type& k) const; ``` - 参数:要查找的键`k` - 返回值:迭代器类型,指向键为`k`的元素位置 #### 3. 使用示例 ```cpp #include <iostream> #include <map> int main() { std::map<int, std::string> studentMap = { {101, "Alice"}, {102, "Bob"}, {103, "Charlie"} }; // 查找键102 auto it = studentMap.find(102); if (it != studentMap.end()) { std::cout << "Found: " << it->first << " => " << it->second << std::endl; } else { std::cout << "Key not found" << std::endl; } return 0; } ``` 输出结果: ``` Found: 102 => Bob ``` #### 4. 关键特性说明 1. **时间复杂度**:$O(\log n)$,基于红黑树的实现特性 2. **唯一性检查**:必须通过`it != map.end()`验证查找结果 3. **与泛型算法的区别**:优先使用成员函数`find()`而非`std::find()`,后者时间复杂度为$O(n)$[^1] #### 5. 典型应用场景 - 检测键是否存在:`if (map.find(key) != map.end())` - 安全访问元素:避免直接使用`map[key]`自动插入新键 - 配合erase使用:`map.erase(map.find(key))`(需先检查存在性)[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值