【Protobuf】Map类型的使用

news/2024/10/22 12:25:10/

文章目录

  • 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.ppmy.cn/news/345102.html

相关文章

s2023gc66面积

用尺取法即可 上代码&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xf…

VSCode_GCC12_C++20标准的Hello World

本文作为记录一下“强迫”自己遵循C20标准学习过程&#xff0c;也权当供后人不要踩我踩过的坑。 先贴代码&#xff0c;一个很简单的Hello World #if __INTELLISENSE__ #include <iostream> #else import <iostream>; #endifint main() {std::cout << "…

跨境电商对于撸卡、撸货、采退都需要哪些技术要求

在当前跨境电商环境下&#xff0c;从事撸卡、撸货或者采退等业务的人员日益增多。然而&#xff0c;由于大部分人使用的环境系统相对简单&#xff0c;例如云手机、一键新机工具IP、指纹浏览器IP、虚拟机等&#xff0c;缺乏足够复杂的防护机制&#xff0c;因此&#xff0c;经常会…

人脸检测(libfacedetection,retinaface等)

1.libfacedetection 它最大的亮点是能够在所有支持 C/C的平台上编译运行。作者将预训练的 CNN 模型转换为静态变量后储存到了 C 文件里&#xff0c;使得该项目不需要任何其他依赖项&#xff08;当然 OpenCV 还是需要的&#xff09;&#xff0c;仅仅只需要一个 C编译器&#xf…

天池大数据竞赛 Spaceack带你利用Pandas,趋势图与桑基图分析美国选民候选人喜好度

长文预警 竞赛地址&#xff1a; https://tianchi.aliyun.com/competition/entrance/531837/introduction 首先&#xff0c;这是一篇面向新人的教程导向的分析文章&#xff0c;&#xff08;by the way其实我也是新手&#xff0c;从比赛开始才学的Pandas库&#xff0c;这也是我…

cpu相关的基础知识

8核、6核、4核、双核CPU是什么意思 概念&#xff1a;CPU是什么、做什么用、一般CPU是接在哪里的&#xff0c;我们先来看看CPU是什么&#xff0c;CPU既中央处理器、电脑中一个最重要&#xff0c;最核心的东西&#xff0c;市面上能买到的CPU只有两种&#xff0c;一种是INTEL公司…

Maix Bit(K210)简介

Maix Bit学习笔记 1、Maix Bit简介1.1、特点 2、Maix Bit引脚分配3、资源下载4 、开发环境4.1 SDK开发&#xff08; Kendryte IDE&#xff09;4.2 Maixpy IDE开发 1、Maix Bit简介 最近看到K210强大的性能&#xff0c;被其所吸引&#xff0c;随之入手了一款K210开发板&#xff…

GDKOI2023 D2T1

前言 相比于D1T1&#xff0c;这题才是真正的签到题&#xff0c;然而&#xff0c;我却爆0了。为了纪念这悲壮的0分&#xff0c;写下了这篇题解。 题目大意 给出 n ( 1 ≤ n ≤ 1 0 5 ) n(1\le n\le 10^5) n(1≤n≤105) 个字符串及其出现时间&#xff08;以几点几分给出&…