C++ STL标准库 《map容器详解》

简介: C++ STL标准库 《map容器详解》

一、map简介

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

 

二、map的功能

自动建立Key - value的对应。key 和 value可以是任意你需要的类型。

根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。

快速插入Key - Value 记录。

快速删除记录

根据Key 修改value记录。

遍历所有记录。

三、使用map

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

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

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

 map<string, int>   my_Map; 
 或者是:
 typedef  map<string, int>   MY_MAP; 
 MY_MAP  my_Map; 

四、插入元素

  map<string,  int>   my_Map; 
  (1)   my_Map["a"]   =   1; 
  (2)   my_Map.insert(map<string,   int>::value_type("b",2)); 
  (3)   my_Map.insert(pair<string,int>("c",3)); 
  (4)   my_Map.insert(make_pair<string,int>("d",4)); 

五、查找和修改元素

 (1)   int i = my_Map["a"]; 
       my_Map["a"] = i; 

 (2)   MY_MAP::iterator my_Itr; 
       my_Itr.find("b"); 
       int j = my_Itr->second; 
       my_Itr->second = j; 

不过注意,键本身是不能被修改的,除非删除。通过map对象的方法获取的iterator数据类型是一个std::pair对象,包括两个数据 iterator->first 和 iterator->second 分别代表关键字和存储的数据。

 

、删除元素

  (1)   my_Map.erase(my_Itr); 

  (2)   my_Map.erase("c"); 

注意,第一种情况在迭代期间是不能被删除的,道理和foreach时不能删除元素一样。

 

七、迭代数据

for(my_Itr=my_Map.begin();  my_Itr!=my_Map.end(); ++my_Itr)
 { } 

八、其它方法

  my_Map.size()               返回元素数目 
  my_Map.empty()       判断是否为空 
  my_Map.clear()           清空所有元素  

可以直接进行赋值和比较:=,   >,   >=,   <,   <=,   !=   等等

九、基本操作函数:

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);//列表移除
 }
相关文章
|
11月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
302 2
|
11月前
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
601 73
|
12月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
268 9
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
275 5
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
280 2
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
209 0
|
设计模式 存储 C++
【C++】C++ STL探索:容器适配器 Stack 与 Queue 的使用及模拟实现(二)
【C++】C++ STL探索:容器适配器 Stack 与 Queue 的使用及模拟实现
159 0
|
6月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1010 108