6.1 C++ STL 序列映射容器
Map/Multimap 映射容器属于关联容器,它的每个键对应着每个值,容器的数据结构同样采用红黑树进行管理,插入的键不允许重复,但值是可以重复的,如果使用Multimap声明映射容器,则同样可以插入相同的键值。
Map中的所有元素都会根据元素的键值自动排序,所有的元素都是一个Pair同时拥有实值和键值,Pair的第一个元素被视为键值,第二个元素则被视为实值,Map 容器中不允许两个元素有相同的键出现。
6.1 通过对组实现键值对
这段代码演示了C++中标准库中pair和set的用法。pair是一个用来存储一对值的数据类型,可以用来表示关联数组或者键值对。set是一个用来存储不重复元素的集合,其内部自动对元素进行排序,具体排序方式由元素类型的比较函数定义。
代码中首先创建了两个pair对象p和p2,分别用string和int类型的值进行初始化。接着创建了一个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的find、lower_bound、upper_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;
}
6.1 C++ STL 序列映射容器的更多相关文章
- STL序列式容器学习总结
STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...
- STL——序列式容器
一.容器概述与分类 1. STL容器即是将运用最广的一些数据结构实现出来.常用的数据结构有array, list, tree, stack, queue, hash table, set, map…… ...
- STL序列式容器使用注意、概念总结
引入 最近看了<STL源码剖析>的第 4 章和第 5 章,介绍了 C++ STL 中的序列式容器和关联式容器,本文将总结序列式容器的基础概念,不会详细它们的实现原理(想知道自个儿看书吧,我 ...
- 数据结构-STL序列式容器总结
根据序列在容器中的排列特性,将常见数据结构分为:序列式容器和关联式容器. 常见序列式容器有 1.array(build-in)c++內建 2.vector 3.heap(以算法方式呈现) 4.prio ...
- STL序列式容器
1.vector 空间运用的灵活性. 实现技术——关键是对大小的控制以及重新配置时的数据移动效率. 配置新空间.数据移动.释还旧空间 erase(int pos ...
- STL关联式容器使用注意、概念总结
引入 继上文 STL序列式容器使用注意.概念总结 继续总结关联式容器的概念以及一些使用事项. 关联式容器与容器适配器 基础容器 STL 中的关联式底层容器:RB tree, hash table,可以 ...
- STL源码剖析读书笔记--第四章--序列式容器
1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...
- STL源码剖析之序列式容器
最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...
- STL 序列容器
转自时习之 STL中大家最耳熟能详的可能就是容器,容器大致可以分为两类,序列型容器(SequenceContainer)和关联型容器(AssociativeContainer)这里介绍STL中的各种序 ...
- STL之关联容器的映射底层
STL的关联容器有set, map, multiset, multimap.用于实现它们的底层容器有划入标准的rb_tree和待增加标准的hashtable. 底层容器rb_tree为上层容器提供了一 ...
随机推荐
- 【原理篇】WebView 实现嵌套滑动,丝滑般实现吸顶效果,完美兼容 X5 webview
本文首发我的微信公众号徐公,收录于 Github·AndroidGuide,这里有 Android 进阶成长知识体系, 希望我们能够一起学习进步,关注公众号徐公,5 年中大厂程序员,一起建立核心竞争力 ...
- k8s-部署 Kubernetes 集群(kubeadm方式)
一 机器准备 IP 主机名 角色 配置 安装组件 192.168.198.150 master-1 master 2U2G master组件 etcd kubectl 192.168.198.151 ...
- CompletableFuture 测试类
package com.example.apidemo.completableFutrue; import java.util.Random; import java.util.concurrent. ...
- 第65篇 AJAX初识 校验用户名 登录示例 文件上传 csrftoken
1, 知识储备 2. AJAX的定义 异步的JavaScript和XML 使用场景: JavaScript和后端的数据传递 2.1原生的JavaScript实现AJAX 2.2 JQuery实现 2. ...
- go 接口学习笔记
这里是对接口在汇编层面上转换和实现的小结,详细了解可参考 Go 语言接口的原理 1. 类型转换:结构体到接口 1.1 结构体方法实现接口 package main type Duck interfac ...
- 你不知道的JavaScript APIs
前言 在本文中,将介绍一些鲜为人知但却非常有用的API,如: Page Visibility API Web Share API Broadcast Channel API International ...
- 基于python+django的酒店预定网站-酒店管理系统
该系统是基于python+django开发的酒店预定管理系统.适用场景:大学生.课程作业.毕业设计.学习过程中,如遇问题可在github给作者留言. 演示地址 前台地址: http://hotel.g ...
- python3使用diagrams生成架构图
技术背景 对于一个架构师或者任何一个软件工程师而言,绘制架构图都是一个比较值得学习的技能.这就像我们学习的时候整理的一些Xmind那种思维逻辑图一样,不仅可以帮我们看到组件之间的联系和层级,还能够展示 ...
- MCU芯片架构设计
目录 1.应用场景 主要是I2C\UART\SPI协议 2.Cortex-M3 MCU成本与工艺选型 按照晶圆进行收费,28nm,12寸晶圆,400万美金 晶圆是圆形的,die是方形的,会存在浪费 p ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.01.02)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...