C++ map的基本操作

本文详细介绍了C++ STL中的map容器,包括其特点、功能、使用方法及基本操作函数等。并通过具体示例展示了如何在程序中有效地使用map。

转自http://www.cnblogs.com/hailexuexi/archive/2012/04/10/2440209.html

1、map简介

map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。

2、map的功能

自动建立Key - value的对应。key 和 value可以是任意你需要的类型。 
根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。 
快速插入Key - Value 记录。 
快速删除记录 
根据Key 修改value记录。 
遍历所有记录。 
3、使用map

使用map得包含map类所在的头文件

#include <map> //注意,STL头文件没有扩展名.h

map对象是模板类,需要关键字和存储对象两个模板参数:

std:map<int, string> personnel;

这样就定义了一个用int作为索引,并拥有相关联的指向string的指针.

为了使用方便,可以对模板类进行一下类型定义,

typedef map<int, CString> UDT_MAP_INT_CSTRING;

UDT_MAP_INT_CSTRING enumMap;

4、在map中插入元素

改变map中的条目非常简单,因为map类已经对[]操作符进行了重载

enumMap[1] = "One";

enumMap[2] = "Two";

.....

这样非常直观,但存在一个性能的问题。插入2时,先在enumMap中查找主键为2的项,没发现,然后将一个新的对象插入enumMap,键是2,值是一个空字符串,插入完成后,将字符串赋为"Two"; 该方法会将每个值都赋为缺省值,然后再赋为显示的值,如果元素是类对象,则开销比较大。我们可以用以下方法来避免开销:

enumMap.insert(map<int, CString> :: value_type(2, "Two"))

5、查找并获取map中的元素

下标操作符给出了获得一个值的最简单方法:

CString tmp = enumMap[2];

但是,只有当map中有这个键的实例时才对,否则会自动插入一个实例,值为初始化值。

我们可以使用Find()和Count()方法来发现一个键是否存在。

查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.

int nFindKey = 2; //要查找的Key

//定义一个条目变量(实际是指针)

UDT_MAP_INT_CSTRING::iterator it= enumMap.find(nFindKey);

if(it == enumMap.end()) {

//没找到

}

else {

//找到

}

通过map对象的方法获取的iterator数据类型是一个std::pair对象,包括两个数据 iterator->first 和 iterator->second 分别代表关键字和存储的数据

6、从map中删除元素

移除某个map中某个条目用erase()

该成员方法的定义如下

iterator erase(iterator it); //通过一个条目对象删除 
iterator erase(iterator first, iterator last); //删除一个范围 
size_type erase(const Key& key); //通过关键字删除 
clear()就相当于 enumMap.erase(enumMap.begin(), enumMap.end());

7、map的基本操作函数:
      C++ Maps是一种关联式容器,包含“关键字/值”对
      begin()          返回指向map头部的迭代器
      clear()         删除所有元素
      count()          返回指定元素出现的次数
      empty()          如果map为空则返回true
      end()            返回指向map末尾的迭代器
      equal_range()    返回特殊条目的迭代器对
      erase()          删除一个元素
      find()           查找一个元素
      get_allocator()  返回map的配置器
      insert()         插入元素
      key_comp()       返回比较元素key的函数
      lower_bound()    返回键值>=给定元素的第一个位置
      max_size()       返回可以容纳的最大元素个数
      rbegin()         返回一个指向map尾部的逆向迭代器
      rend()           返回一个指向map头部的逆向迭代器
      size()           返回map中元素的个数
      swap()            交换两个map
      upper_bound()     返回键值>给定元素的第一个位置
      value_comp()      返回比较元素value的函数

例子:

//遍历:

map<string,CAgent>::iterator iter;
 for(iter = m_AgentClients.begin(); iter != m_AgentClients.end(); ++iter)
 {
   if(iter->first=="8001"  {
     this->SendMsg(iter->second.pSocket,strMsg);//iter->first
   }
 }

//查找:

map<string,CAgent>::iterator iter=m_AgentClients.find(strAgentName);
 if(iter!=m_AgentClients.end())//有重名的  {
 }
 else //没有{
 }

//元素的个数

if (m_AgentClients.size()==0)

//删除

map<string,CAgent>::iterator iter=m_AgentClients.find(pSocket->GetName());
 if(iter!=m_AgentClients.end())
 {

     m_AgentClients.erase(iter);//列表移除
 }

<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、付费专栏及课程。

余额充值