Boost::序列化 std::unordered_map<double, std::vector<double>>
Boost::serialization of an std::unordered_map<double, std::vector<double>>
我试图序列化一个简单的std::unordered_map>使用boost::serialize。我设法把地图保存得很好。这个问题发生时,我试图加载它。下面是我写的代码:
double E = 250E-4;
std::vector<double> init_vals(2,0.0);
std::unordered_map<double, std::vector<double>> map;
std::ofstream ofs("energy_map");
boost::archive::binary_oarchive oa(ofs);
map.emplace(E, init_vals);
oa << map;
我加载地图的代码是这样的:
std::ifstream ifs("energy_map");
std::unordered_map <double, std::vector<double>> map;
boost::archive::binary_iarchive ia(ifs);
ia >> map;
我得到一个boost::archive::archive_exception对于行"ia>> map;"。该异常是一个"unregistered_cast"异常,根据boost文档说明:
//基派生关系未注册//void_cast_register我不太确定为什么这行不通,因为它看起来相当简单。(我已经编辑了原始文件中的代码以使其更简单,但这些行与我的代码中的行相同)。
任何帮助都是感激的。谢谢!
很可能您正在/也/序列化一些其他多态类型。一个SSCCE示例显示了这在GCC上的工作:
http://paste.ubuntu.com/12963866/#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/serialization/unordered_map.hpp>
#include <boost/serialization/vector.hpp>
#include <fstream>
#include <iostream>
void write_map() {
std::unordered_map<double, std::vector<double> > map;
{
double E = 250E-4;
std::vector<double> init_vals(2, 0.0);
map.emplace(E, init_vals);
}
{
std::ofstream ofs("energy_map");
boost::archive::binary_oarchive oa(ofs);
oa << map;
}
}
void load_map() {
std::unordered_map<double, std::vector<double> > map;
{
std::ifstream ifs("energy_map");
boost::archive::binary_iarchive ia(ifs);
ia >> map;
}
for (auto &p : map) {
std::cout << p.first << " -> { ";
std::copy(p.second.begin(), p.second.end(), std::ostream_iterator<double>(std::cout, " "));
std::cout << "}n";
}
}
int main() {
write_map();
load_map();
}
所以如果你仍然有问题,检查
- 未定义行为
- 用于ABI问题(是否使用与主程序相同的编译器/库版本和标志进行boost编译)
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- C++在数学计算中将double转换为int
- 在c++中为double类型的数组创建一个unique_ptr
- vector<vector<double>> to mxArray using memcpy
- (double) 和 double() 之间的区别
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- C++ Version Of Double.longBitsToDouble
- 错误:类型"double()"和"double()"的操作数无效到二进制&quo
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 使用 std::vector<double> 访问由 std::unique_ptr<double[2] 管理的数据>
- 将 std::vector<double> 从 C++ 包装到 C 以在 Swift 中使用
- 错误:无法将"<lambda(double)>"转换为"double(*)(double)"
- 如何正确将"strings"转换为"double"?
- 如何在<double>矢量中创建复杂类型的模板<T>?
- "double* grade"、"double *grade"和"double* fn()"有什么区别?
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ