讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

updream

一键生成高质量推广成片

Laper
Laper

剧本策划到成片协作

立刻MV
立刻MV

低成本歌曲 MV、视频生成

c++如何将map容器序列化到文件_键值对存储与读取【详解】

陌涛大大_6019

陌涛大大_6019

发布时间:2026-04-12 19:32:34

|

833人浏览过

|

来源于php中文网

原创

std::map不能直接二进制序列化,因其红黑树实现含不可持久化的指针、分配器状态及跨平台内存布局差异;应手动遍历转为JSON或键值行等文本格式。

c++如何将map容器序列化到文件_键值对存储与读取【详解】

C++ 的 std::map 本身不支持直接序列化,必须手动遍历 + 自定义格式写入,否则读取时无法还原结构或类型。

为什么不能直接用 write() 写二进制内存?

因为 std::map 是红黑树实现,内部节点指针、分配器状态、迭代器有效性等均不可跨进程/跨平台持久化。直接 write() 内存块会导致:

  • 读取时指针悬空、崩溃或数据错乱
  • 不同编译器/STL 版本下内存布局不兼容
  • 字符串、自定义类等非 POD 类型成员未被正确序列化

推荐方案:文本格式(如 JSON 或键值行)更安全易调试

除非有强性能要求,否则优先选人类可读、语言中立的格式。例如每行存一个键值对:

apple 12
banana 8
cherry 15

写入代码示例(假设 key 和 value 都是 std::string 和 int):

立即学习“C++免费学习笔记(深入)”;

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
std::ofstream ofs("data.txt");
for (const auto& [k, v] : my_map) {
    ofs << k << " " << v << "\n";
}

读取时注意:

  • 用 std::getline() 按行读,再用 std::istringstream 拆分
  • 检查拆分后是否真有两个字段,避免空行或格式错误导致 operator>> 失败
  • 若 key 含空格,需改用 CSV 或 JSON,否则解析会断裂

二进制序列化需自行管理类型与长度(仅限 POD)

如果坚持二进制且 key/value 全是 POD(如 int, double, char[32]),必须显式写入元素个数 + 每个元素的字节长度:

size_t n = my_map.size();
ofs.write(reinterpret_cast<const char*>(&n), sizeof(n));
for (const auto& [k, v] : my_map) {
    ofs.write(reinterpret_cast<const char*>(&k), sizeof(k));
    ofs.write(reinterpret_cast<const char*>(&v), sizeof(v));
}

但该方式严重受限:

  • 不支持 std::string、std::vector 等动态类型(它们只存指针)
  • 不同平台字节序(endianness)不一致时需转换
  • 无版本控制,结构一变旧文件就彻底失效

真正健壮的做法:用 boost::serialization 或 nlohmann/json

手写序列化极易出错,尤其涉及嵌套、多态或未来扩展。推荐引入轻量依赖:

  • 用 nlohmann::json:支持任意嵌套,自动处理字符串转义、Unicode、类型推导
  • 用 boost::serialization:C++ 原生风格,支持指针、继承、版本号,但需为自定义类加宏
  • 二者都要求 map 的 key/value 类型可序列化——比如 std::string 和 int 默认就支持

关键点常被忽略:序列化不是“存下来就行”,而是“下次能按原语义重建”。哪怕只是临时调试,也建议至少用空格分隔的明文格式——它比二进制更能暴露数据逻辑问题。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SoundView
SoundView Hot

SoundView是一款面向跨境电商的视频翻译、配音和本地化 AI 创作平台。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2355

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3882

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1296

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4519

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7599

2023.08.02

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

375

2025.11.27

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1938

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

3224

2023.09.04

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

100

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn