6.1 C++ STL 序列映射容器-程序员宅基地

技术标签: 《灰帽黑客:攻守道》  c++  微软技术  Visual C++  信息安全  序列容器  开发语言  

Map/Multimap 映射容器属于关联容器,它的每个键对应着每个值,容器的数据结构同样采用红黑树进行管理,插入的键不允许重复,但值是可以重复的,如果使用Multimap声明映射容器,则同样可以插入相同的键值。

Map中的所有元素都会根据元素的键值自动排序,所有的元素都是一个Pair同时拥有实值和键值,Pair的第一个元素被视为键值,第二个元素则被视为实值,Map 容器中不允许两个元素有相同的键出现。

6.1 通过对组实现键值对

这段代码演示了C++中标准库中pairset的用法。pair是一个用来存储一对值的数据类型,可以用来表示关联数组或者键值对。set是一个用来存储不重复元素的集合,其内部自动对元素进行排序,具体排序方式由元素类型的比较函数定义。

代码中首先创建了两个pair对象p和p2,分别用stringint类型的值进行初始化。接着创建了一个set对象var,用来存储int类型的元素。由于set中不能存在重复的元素,所以在插入元素10时,因为之前已经插入过10,所以插入失败,返回了一个pair对象,其中second为false,表示插入失败。最后程序暂停等待用户操作,防止程序退出。

#include <iostream>
#include <set>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
       // 创建的对组字符串
  pair<string, int> p(string("lyshark"), 100);
  pair<string, int> p2 = make_pair("jerry", 200);
  cout << "Name: " << p.first << endl;
  cout << "Age: " << p.second << endl;

  // 检测集合元素是存在重复的,如果出现重复的则报错
  set<int> var;
  var.insert(10);  // 由于插入过10这个元素,所以在此插入则会报错
  pair<set<int>::iterator, bool> ret = var.insert(10);
  if (!ret.second)
    cout << "insert error" << endl;

  system("pause");
  return 0;
}

6.2 正反向遍历映射容器

这段代码演示了如何使用C++ STL中的map容器,其中包括了map的插入、删除、正向遍历、反向遍历等常用操作。其中,map是一种键值对映射容器,通过key可以快速查找value。本代码中使用了三种方式实现了map容器的插入操作,分别是insert函数、make_pair函数、数组形式。在插入之后,使用erase函数删除了其中的一个键值对。正向遍历和反向遍历分别使用了map的迭代器和反向迭代器。

#include <iostream>
#include <map>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
    
  map<string, int> mp;
  // 三种方式实现map容器插入操作
  mp.insert(pair<string, int>("admin0", 100));
  mp.insert(make_pair("admin1", 200));
  mp["admin2"] = 300;

  mp.erase("admin2");    // 删除第3个数据

  // 正向遍历键值对
  for (map<string, int>::iterator it = mp.begin(); it != mp.end(); it++)
    cout << "key = " << it->first << " --> value = " << it->second << endl;

  cout << endl;
  // 反向遍历键值对
  for (map<string, int>::reverse_iterator it = mp.rbegin(); it != mp.rend();it ++)
    cout << "key = " << it->first << " --> value = " << it->second << endl;
  system("pause");
  return 0;
}

6.3 查找映射容器中的元素

这段代码实现了使用STL库中的map类型来存储一组键值对,其中键是字符串类型,值是整数类型。代码中演示了如何使用map的findlower_boundupper_bound方法来查找指定的键值对,分别返回该元素的迭代器、第一个大于等于该元素的迭代器和第一个大于该元素的迭代器。

#include <iostream>
#include <map>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
    
  map<string, int> mp;

  mp["admin0"] = 100;
  mp["admin1"] = 200;
  mp["admin2"] = 300;
  
  // 寻找admin0是否存在于键值对中
  map<string, int>::iterator pos = mp.find("admin0");
  if (pos != mp.end())
    cout << "key = " << pos->first << " --> value = " << pos->second << endl;

  // lower_bound(keyElem) 返回第一个key=keyElem元素的迭代器
  map<string, int>::iterator ret = mp.lower_bound("admin0");
  if (ret != mp.end())
    cout << "lower_bound key = " << ret->first << " --> lower_bound value = " << ret->second << endl;
  
  // upper_bound(keyElem) 返回第一个key>keyElem元素的迭代器
  map<string, int>::iterator ret1 = mp.upper_bound("admin0");
  cout << "upper_bound key = " << ret1->first << " --> upper_bound value = " << ret1->second << endl;
  system("pause");
  return 0;
}

6.4 遍历映射容器中的结构

这段代码是一个使用STL的map容器存储学生信息的示例程序,其中使用了结构体来存储学生信息。在主函数中,首先将三个学生信息存储到一个StudentRecord数组中,然后通过将这些学生信息放入map容器中,实现将学生信息与其对应的ID关联起来。接着,通过迭代器遍历整个map容器,将每个学生的ID和姓名输出到屏幕上。最后,通过使用map容器的find方法,查找学生ID为1的学生信息,并将其姓名输出到屏幕上。

#include <iostream>
#include <map>
#include <string>

using namespace std;

struct StudentInfo{
    
  char *name;
  int year;
  char *addr;
};

struct StudentRecord{
    
  int id;
  StudentInfo stu;
};

int main(int argc, char* argv[])
{
    
  StudentRecord szArray[] = {
    
    {
     1, "admin0", 22, "beijing" },
    {
     2, "admin1", 33, "shanghai" },
    {
     3, "admin2", 24, "jinan" },
  };
  // 创建Map映射
  map<int, StudentInfo> mp;

  // 初始化,将学生数组装入映射
  for (int x = 0; x < 3; x++)
  {
    
    mp[szArray[x].id] = szArray[x].stu;
  }
  // 迭代遍历Map中所有的数据
  map<int, StudentInfo>::iterator start, end;
  end = mp.end();
  for (start = mp.begin(); start != end; start++)
    cout << "ID: " << (*start).first << " --> Name: " << (*start).second.name << endl;

  // 迭代寻找mp.find(1) 元素,并打印出其内部成员
  map<int, StudentInfo>::iterator i = mp.find(1);
  cout << "First: " << (*i).first << endl;
  cout << "Name: " << (*i).second.name << endl;
  system("pause");
  return 0;
}

6.5 通过映射容器实现分组

这段代码是一个员工分组的示例程序,通过随机生成5个员工成员,然后随机将这些员工分到三个部门中(人力、研发、美术),最后输出人力部门的员工名单。它使用了 vector存储员工信息,使用multimap存储分组信息,通过枚举类型和常量来定义部门编号,实现了分组和展示分组的功能。

#include <iostream>
#include <vector>
#include <string>
#include <map>

using namespace std;

enum {
    RENLI,YANFA,MEISHU};  // 定义三个部门 RENLI=0
class Worker
{
    
public:
  string m_name;
  int m_money;
};
// 随机生成5个员工成员
void CreateWorker(vector<Worker> &v)
{
    
  string nameSeed = "ABCDE";
  Worker w;
  for (int x = 0; x < 5; x++)
  {
    
    string name;
    name += nameSeed[x];
    int money = rand() % 10000+10000;
    w.m_name = name;
    w.m_money = money;
    v.push_back(w);
  }
}
// 打印出指定的部门信息,查其他分组只需修改RENLI为其他即可
void ShowGroup(multimap<int, Worker> &m)
{
    
  cout << "Group:" << endl;
  multimap<int,Worker>::iterator pos = m.find(RENLI);
  int index = 0;            // 计数器每次递增,直到等于num
  int num = m.count(RENLI); // 人力部门有多少调数据
  for (; pos != m.end(), index < num; pos++, index++)
  {
    
    cout << "Name: " << pos->second.m_name << endl;
  }
}
// 实现员工分组
void SetGroup(vector<Worker> &v,multimap<int,Worker> & m)
{
    
  for (vector<Worker>::iterator it = v.begin(); it != v.end(); it++)
  {
    
    // 随机的产生一个部门编号
    int departmentId = rand() % 3;
    // 将员工分到multimap容器中, 1=mp
    m.insert(make_pair(departmentId, *(it)));
  }
}
int main(int argc, char* argv[])
{
    
  vector<Worker> v;
  CreateWorker(v);
  // 实现员工分组,分组的multimap容器
  multimap<int, Worker> mp;
  SetGroup(v,mp);     // 实现员工分组
  ShowGroup(mp);      // 显示分组信息

  system("pause");
  return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lyshark_csdn/article/details/132317247

智能推荐

【QT】缺少Qt5Widgetsd.dll等文件的问题_qt5widgets.dll-程序员宅基地

文章浏览阅读2.4k次。在生成的exe文件处进入cmd命令行,执行命令。?.exe为工程生成的可执行文件名称。执行后目录下会出现对应的配置文件。_qt5widgets.dll

并行与分布式 第七章 体系结构 上_并行与分布式系统目录-程序员宅基地

文章浏览阅读1.5k次,点赞16次,收藏2次。多核CPU采用了与原来的单CPU相同的硬件体系结构,显著提升计算能力的同时无需进行硬件技术的变更。• 当出现某cache块被替换写回时,被写回的旧块有唯一目录节点B1,被调入的新块有唯一目录节点B2,cache和B1、B2都是单线联系,B1和B2在逻辑上是不同的节点,当然地址分布重合也可能导致B1和B2落在相同的物理节点中。• 共享数据进入Cache,则同一存储块在多个处理器的Cache中有副本,当某个处理器对其Cache中的副本修改后,该副本与其他副本中的数据不一致,称为多处理机的Cache一致性问题。_并行与分布式系统目录

【单片机毕业设计】【mcuclub-hj-006-7】基于单片机的空气质量(天然气、CO、甲醛、甲苯、TVOC、CO2)检测的设计_tvoc测定方案电路-程序员宅基地

文章浏览阅读1.2k次,点赞4次,收藏25次。空气质量(天然气、CO、甲醛、甲苯、TVOC、CO2)_tvoc测定方案电路

软件测试工程_绪论笔记_软件测试绪论笔记-程序员宅基地

文章浏览阅读5.9k次。标签: #课程更新:2021-09-17 11:09链接:理论测试的相关定义:发现软件缺陷,保证(某个可靠度的)软件质量在不测试的代价超过测试的代价之前,进行测试(尽早启动)工程专业的特点产品制造流程:设计——测试和验证——生产理解软件 = 程序 + 文档软件测试 != 程序测试也就是说,测试包括了对文档的检查。测试定义的两面性:正向思维:验证软件是否符合需求,验证软件能否正常工作逆向思维:发现未发现的错误标准定义使用人工或自动手段,来运行或测试.._软件测试绪论笔记

使用LSTM深度学习模型进行温度的时间序列单步和多步预测_预测温度用哪个深度学习模型-程序员宅基地

文章浏览阅读1.1w次,点赞19次,收藏115次。本文的目的是提供代码示例,并解释使用python和TensorFlow建模时间序列数据的思路。本文展示了如何进行多步预测并在模型中使用多个特征。本文的简单版本是,使用过去48小时的数据和对未来1小时的预测(一步),我获得了温度误差的平均绝对误差0.48(中值0.34)度。利用过去168小时的数据并提前24小时进行预测,平均绝对误差为摄氏温度1.69度(中值1.27)。所使用的特征是过去每小时的温度数据、每日及每年的循环信号、气压及风速。使用来自https://openweathermap.org/_预测温度用哪个深度学习模型

【Java基础】Java SPI 一 之SPI(Service Provider Interface)进阶& AutoService_java autoservice-程序员宅基地

文章浏览阅读1.4k次,点赞36次,收藏36次。SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制(为某个接口寻找服务实现的机制),可以用来启用框架扩展和替换组件,其核心思想就是解耦。模块之间基于接口编程,模块之间不对实现类进行硬编码,当代码里涉及具体的实现类,就违反了可拔插的原则,为了实现在模块装配的时候能不在程序里动态指明,就需要spi了。这里我们要跟API区分开来,简单介绍一下API。_java autoservice

随便推点

基于风控特征相关度,挖掘贷中等场景中的存量客户价值|来看看相关实操_风控 建立存量客户的特征标签-程序员宅基地

文章浏览阅读836次。基于风控特征相关度,挖掘贷中等场景中的存量客户价值|来看看相关实操_风控 建立存量客户的特征标签

Internet Download Manager v6.36 Build 3 Final 注册版-IDM下载工具_ternet_download_manager 注册版-程序员宅基地

文章浏览阅读1.9k次。亲测可用Internet Download Manager(简称IDM)下载速度最多达其他下载工具5倍的下载具。Internet Download Manager的续传功能可以恢复因为断线、网络问题、计算机当机甚至无预警的停电导致下传到一半的软件。此程序具有动态档案分割、多重下载点技术,而且它会重复使用现有的联机,而不需再重新联机登入一遍。聪明的in-speed技术会动态地将所有设定应用到某种..._ternet_download_manager 注册版

华为Java社招面试经历详解【已拿到offer】_广州华为java招聘-程序员宅基地

文章浏览阅读3.2k次,点赞4次,收藏28次。这篇文章主要介绍了华为Java社招面试经历,详细记录了华为java面试的流程、相关面试题与参考答案,需要的朋友可以参考下。看看自己能答对多少,如果能回答70%的题目,就大胆去阿里以及各互联网公司试试身手吧。本篇建议大家收藏、备用~华为Java社招面试(已拿到offer)之前月底华为cloudsop部门打电话叫我要不要面试,当时正处于换工作的期间,于是就把简历发给华为hr,人事审核后经过一些列面试、机试,最终顺利拿到了offer,出于未来职业规划的考量,本人手里还有其他的一些offer,还没有定下来,顺_广州华为java招聘

linux线程的基本知识_linux加锁失败的状态符-程序员宅基地

文章浏览阅读2.6k次。使用自旋锁的时候,当发生多线程竞争锁的情况,加锁失败的线程会忙等待,直到拿到锁。2、 fork两次,第一次fork的子进程在fork完成后直接退出,这样第二次fork得到的子进程就没有爸爸了,它会自动被老祖宗init收养,init会负责释放它的资源,这样就不会有“僵尸”产生了。线程的等待,第一个参数是线程的id,第二个一般为NULL,表示不关心退出的状态。第一个参数是线程id的地址。互斥锁加锁失败后,会从用户态陷入到内核态,让内核帮助我们切换线程,虽然简化了使用锁的难度,但是存在一定的性能开销成本。_linux加锁失败的状态符

000_coolprop_in_matlab在Matlab中使用CoolProp-程序员宅基地

文章浏览阅读1.2k次,点赞26次,收藏12次。在Matlab中调用Python需要先设置Python的路径(pyenv在Matlab中调用Python的函数有两种方式,一种是使用py函数,一种是使用函数;在Matlab中调用Python的CoolProp接口,需要导入CoolProp模块,然后调用函数即可。可以写一个Matlab函数,来调用PropsSI函数。使用函数;在Matlab中调用Python的CoolProp接口,需要导入CoolProp模块,然后调用函数即可。可以写一个Matlab函数,来调用PropsSI函数。_matlab中使用coolprop

推荐文章

热门文章

相关标签