【Protobuf速成指南】Map类型的使用

news2025/2/13 12:46:15

文章目录

  • 2.4 map 类型
    • 一、 基本认识
    • 二、map相关函数
      • 4.3 contact2.4的改写

2.4 map 类型

 本系列文章将通过对通讯录项目的不断完善,带大家由浅入深的学习Protobuf的使用。这是Contacts的2.4版本,在这篇文章中将带大家学习Protobuf的 map 语法,并将其用到我们的项目中

一、 基本认识

protobuf语法也支持我们创建创建关联映射字段,即使用map类型去声明字段:

map<key_type, val_type> mapfiled = N;

有以下几点需要注意:

  • key_type 可以为float/double和bytes外的任意标量类型,否则在编译时就会出错。而value_type可以为任意类型

    image-20230612140825868

  • map类型不可以用 repeated 修饰

  • 向map中插入的数据是 unordered

二、map相关函数

我们向 PeopleInfo 中增加一个 map 类型的remark字段:

syntax = "proto3";
package contact2;

import "google/protobuf/any.proto";

message Address{
    string home = 1;
    string company = 2;
}

message PeopleInfo{
    string name = 1;
    int32 age = 2;
    message Phone{   
        string number = 1;
        enum PhoneType{
            MOBILE = 0;
            FIXED = 1;
        }
        PhoneType type = 2;
    }
    repeated Phone phone = 3;
    google.protobuf.Any addr = 4;
    oneof other_contact{
        string qq = 5;
        string wechat = 6;
    }
    // ------------- 新增内容 -----------------
    map<string, string> remark = 7;
    // ---------------------------------------
}

message Contact{
    repeated PeopleInfo contact = 1;
}

 编译 .prtoo 文件后观察新生成的部分函数。相信现在大家根据函数的名字就可以推断处对应的函数功能了

// 返回map的大小
inline int PeopleInfo::remark_size() const {}

// 清空map的内容
inline void PeopleInfo::clear_remark() {}

// 获取Map容器对象
inline const ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >&
PeopleInfo::remark() const {}

// 返回指向Map容器对象的可变指针
inline ::PROTOBUF_NAMESPACE_ID::Map< std::string, std::string >*
PeopleInfo::mutable_remark() {}

4.3 contact2.4的改写

write.cc改写部分

for(int i = 0;; i++){
    cout << "请输入备注" << i + 1 << "标题(只回车退出): ";
    string title;
    getline(cin, title);
    if(title.empty()) break;

    cout << "请输入备注" << i + 1 << "内容: ";
    string content;
    getline(cin, content);
    p->mutable_remark()->insert({title, content}); 
}

image-20230612143130566

read.cc改写部分

// 首先判断map中是否有内容
if(people.remark_size() != 0){
    cout << "备注信息: " << endl;
}

// 可以使用迭代器遍历map的内容
for(auto iter =  people.remark().cbegin(); 
    iter != people.remark().cend(); iter++){
    cout << iter->first << " : " << iter->second << endl;
}

image-20230612143214576

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/639494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java自制绘图软件

引言 在大连时接触了Java&#xff0c;Java非常优雅&#xff0c;我非常喜欢。期末老师要做一个项目作品&#xff0c;看着windows自带的画图软件&#xff0c;我决定自己动手做一个绘图软件。经过无数次界面调试&#xff0c;刷新层叠关系令我爆肝了一个月&#xff0c;最终完成了这…

没有AI歌手一键包,纯纯的算法项目

项目地址&#xff1a; https://github.com/PlayVoice/so-vits-svc-5.0 来源丨元语音技术 本项目的目标群体是&#xff1a;深度学习初学者&#xff0c;具备Pyhon和PyTorch的基本操作是使用本项目的前置条件&#xff1b; 本项目旨在帮助深度学习初学者&#xff0c;摆脱枯燥的纯…

2023年6月最新|大屏可视化

大屏可视化 一、可视化适配 大屏下显示一般都是16:9尺寸 1920*1080 &#xff0c;做适配也就是在这个比例的基础上进行的 方案一&#xff1a;打开VSCode终端&#xff0c;下载flexible npm i lib-flexible修改源码 要修改的源码的路径&#xff1a; 项目/mode_modules/lib-fl…

Springboot+Vue服务器盲盒活动

文章目录 一、项目要求二、说明文档1、用户抽奖主页/raffle2、多种奖品链接1、奖品1 discont /discount2、奖品2 CPU upgrade /cpu3、奖品3 Memory upgrade /memory4、奖品4 Increase duration /duration5、奖品5 Send to server /server6、奖品6 Configuration upgrade /upgra…

信必优成功案例-全球Tops汽车技术供应商

该集团是全球Tops汽车技术供应商&#xff0c;业务范围涵盖了汽油系统、柴油系统、汽车底盘控制系统、汽车电子驱动、起动机与发电机、电动工具、家用电器、传动与控制技术、热力技术和安防系统等。信必优于2021年开始为该客户服务&#xff0c;参与了客户多个项目&#xff0c;以…

Android进阶 四大组件的工作过程(二):Service的工作过程

Android进阶 四大组件的工作过程&#xff08;二&#xff09;&#xff1a;Service的工作过程 导语 本片文章主要是来介绍Service组件的工作过程的&#xff0c;主要分成Service的启动和Service的绑定两个部分来讲。上一篇文章我们已经介绍了Activity的工作工程&#xff0c;而Ser…

Windows软件:如何安装ideaIU-2020.3.3并使用无限重置插件达到永久使用

​前言&#xff1a; ​在我们做SpringBoot Java项目时&#xff0c;一个好的开发工具可以让我们的效率达到事半功倍&#xff0c;早期的eclipse已经无法满足我们日常需求&#xff0c;当然idea集成开发工具在很早前就已经进入市场&#xff0c;如今取得了无法撼动的地位&#xff0c…

度学习pytorch实战六:ResNet50网络图像分类篇自建花数据集图像分类(5类)超详细代码

1.数据集简介、训练集与测试集划分 2.模型相关知识 3.model.py——定义ResNet50网络模型 4.train.py——加载数据集并训练&#xff0c;训练集计算损失值loss&#xff0c;测试集计算accuracy&#xff0c;保存训练好的网络参数 5.predict.py——利用训练好的网络参数后&#xff0…

为Nomad Web使用添加快捷应用图标

大家好&#xff0c;才是真的好。 上次我们说到Nomad Web已经更新到了1.0.8版本&#xff0c;作为未来的“Notes客户机”&#xff08;运行在浏览器中&#xff09;&#xff0c;Nomad Web的更新迭代很快。从1.0.5版本开始&#xff0c;就可以直接部署在Domino服务器上&#xff0c;而…

STM32MP157_PRO开发板的第一个驱动程序

文章目录 目的&#xff1a;为什么编译驱动程序之前要先编译内核&#xff1f;编译内核编译设备树编译安装内核模块编译内核模块安装内核模块到 Ubuntu 的NFS目录下备用 安装内核和模块到开发板上编译 led 驱动在开发板安装驱动模块下载驱动程序安装驱动模块 目的&#xff1a; 在…

Netty实战(十三)

WebSocket协议&#xff08;一&#xff09; 一、什么是WebSocket 协议二、简单的 WebSocket 程序示例2.1 程序逻辑2.2 添加 WebSocket 支持2.3 处理 HTTP 请求2.4 处理 WebSocket 帧 一、什么是WebSocket 协议 WebSocket 协议是完全重新设计的协议&#xff0c;旨在为 Web 上的双…

读书笔记-《ON JAVA 中文版》-摘要16[第十六章 代码校验]

文章目录 第十六章 代码校验1. 测试1.1 单元测试1.2 JUnit1.3 测试覆盖率的幻觉 2. 前置条件2.1 断言&#xff08;Assertions&#xff09;2.2 Java 断言语法2.3 Guava 断言2.4 使用断言进行契约式设计2.4.1 检查指令2.4.2 前置条件2.4.3 后置条件2.4.4 不变性2.4.5 放松 DbC 检…

Frida技术—逆向开发的屠龙刀

简介 Frida是一种基于JavaScript的动态分析工具&#xff0c;可以用于逆向开发、应用程序的安全测试、反欺诈技术等领域。Frida主要用于在已安装的应用程序上运行自己的JavaScript代码&#xff0c;从而进行动态分析、调试、修改等操作&#xff0c;能够绕过应用程序的安全措施&a…

路径规划算法:基于人工电场优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于人工电场优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于人工电场优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

【Leetcode60天带刷】day06哈希表——242.有效的字母异位词,349. 两个数组的交集,202题. 快乐数,1. 两数之和

题目&#xff1a;242.有效的字母异位词 Leetcode原题链接&#xff1a;242. 有效的字母异位词 思考历程与知识点&#xff1a; 如果一个字母一个字母的找&#xff0c;也就是暴力&#xff0c;用两个for的话时间复杂度是O(N^2)&#xff1b; 我们可以换个思路&#xff0c;a~z一共…

Telerik Report Server R2 2023

Telerik Report Server R2 2023 仪表报告项-使用仪表或类似表盘的显示提供数据的可视化表示。 报告项上的AccessibleRole属性-ARIA(可访问的富Internet应用程序)支持已显著改进。在Web上&#xff0c;当启用了辅助功能时&#xff0c;呈现的报表项包含预定义的辅助功能角色。这样…

(七)矢量数据的空间分析——叠置分析①

矢量数据的空间分析——叠置分析 叠置分析是将代表不同主题的各个数据层面进行叠置&#xff0c;产生一个新的数据层面&#xff0c;叠置结果综合了原来两个或多个层面要素所具有的属性。 叠置分析不仅生成了新的空间关系&#xff0c;而且还将输入的多个数据层的属性联系起来产…

随机的乐趣和游戏

1、猜数字游戏 #GuessingGame.py import random the_number random.randint(1, 10) print("计算机已经在1到10之间随机生成了一个数字&#xff0c;") guess int(input("请你猜猜是哪一个数字: ")) while guess ! the_number:if guess > the_number:p…

【MySQL】数据库基本知识小结

数据库的基本概念 数据库&#xff1a;DataBase 简称 DB&#xff0c;就是信息的集合或者说数据库是由数据库管理系统管理的数据的集合。数据库管理系统&#xff1a;DataBase Management System 简称 DBMS&#xff0c;是一种操纵和管理数据库的大型软件&#xff0c;通常用于建立…

数据结构 一绪论

第一章&#xff1a;绪论 1.1数据结构的基本概念 1.数据&#xff1a;数据是信息的载体&#xff0c;是描述客观事物属性的数、字符以及所有能输入到计算机中并被程序识别 和处理的符号的集合。 2.数据元素&#xff1a;数据元素是数据的基本单位&#xff0c;通常作为一个整体进行…