Boost::serialization只序列化映射的键
boost::serialization to serialize only the keys of a map
我有一个带有map的类,我想使用boost serialize序列化这个类。
std::map<int, ComplicatedThing> stuff;
complexatedthing只要知道整型就可以推导。我想有效地序列化它。一种方法(讨厌,但有效)是创建键的向量并对该向量进行序列化。
// illustrative, not test-compiled
std::vector<int> v;
std::copy(stuff.begin, stuff.end, std::back_inserter(v));
// or
for(std::vector<int> it = v.begin(); it != v.end(); it++)
stuff[*it] = ComplicatedThing(*it);
// ...and later, at serialize/deserialize time
template<class Archive>
void srd::leaf::serialize(Archive &ar, const unsigned int version)
{
ar & v;
}
但这是不优雅的。使用BOOstrongERIALIZATION_SPLIT_MEMBER()和load/save方法,我认为我应该能够完全跳过中间向量的分配。我被困在那里。
也许我的答案在于理解boost/serialization/collections_load_imp.hpp。希望有更简单的路径
您可以将其序列化为int
s列表(我不是指std::list
),而不是将其序列化为容器(映射或向量)。首先写入若干个元素,然后逐个进行反序列化。这是一个10分钟的任务。如果在很多地方都需要此解决方案,请将map封装在类中并为其定义序列化
如果你想让它看起来不笨拙,使用范围适配器
ar & (stuff | transformed(boost::bind(&map_type::value_type::first, _1));
或者如果你包含适当的标题,我想你可以把它减少到
ar & (stuff | transformed(&map_type::value_type::first))
免责声明
- 所有这些都假设Boost序列化附带Boost范围的序列化器(未检查)
- 这可能不能很好地在双向
serialize
设置(你会想要阅读http://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/serialization.html#splitting) - 我没有把上面的代码放到编译器 的附近
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++映射分割错误(核心转储)
- 内联映射初始化的动态atexit析构函数崩溃
- 使用"std::unordereded_map"映射到"std::list"对象
- 如何从多映射中删除特定的重复项
- 在未初始化映射的情况下,将值插入到映射的映射中
- QT通过C++添加映射QML项目
- 在c++中访问int到类对象的映射时出错
- 在C++中搜索嵌套多映射值
- 错误处理.将系统错误代码映射到泛型
- C++匿名结构作为std::映射值
- 如何从存储在std::映射中的std::集中删除元素
- 递归无序映射
- Boost::serialization只序列化映射的键