强 typedef 旨在将原语包装成可跟踪的类型:https://www.boost.org/doc/libs/1_78_0/libs/serialization/doc/strong_typedef.html
BOOST_STRONG_TYPEDEF(float, Float)
但是,这将引入相当大的 (!) 开销,因为每个元素都需要跟踪。在您的示例中,将指针替换为数组索引会使 1000 倍更有意义。
当您使用它时,将其替换为 std::vector<float>,这样您就不会遇到终身问题(和泄漏)。
最后,在关闭文件甚至再次读取文件之前,请确保存档已完成。
参加 #1
Live On Coliru
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/string.hpp>
#include <fstream>
#include <iostream>
#include <numeric>
#include <sstream>
using ConvolutedIndex = std::map<int, std::map<std::string, size_t>>;
int main()
{
auto data = std::vector<float>(1000);
std::iota(data.begin(), data.end(), 0.0); // fill with sample data
float* element = &data[rand() % data.size()]; // pick random element
std::cout << "Random pick: " << *element << " at " << element << "\n";
{
std::ofstream ofs("filename", std::ios::binary);
boost::archive::binary_oarchive oa(ofs);
oa << ConvolutedIndex{
{4,
{
{"foo", element - data.data()},
}},
};
} // also closes file, but more importantly, completes archive first
{
std::ifstream ifs("filename", std::ios::binary);
boost::archive::binary_iarchive ia(ifs);
ConvolutedIndex newMapa;
ia >> newMapa;
std::cout<< "The element recovered: " << data.at(newMapa.at(4).at("foo")) << "\n";
}
}
打印例如
Random pick: 383 at 0x1f142dc
The element recovered: 383
参加 #2
这仍然有问题,因为您从未序列化被索引的浮点数。容易补救:
Live On Coliru
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/vector.hpp>
#include <fstream>
#include <iostream>
#include <numeric>
#include <sstream>
using Data = std::vector<float>;
using ConvolutedIndex = std::map<int, std::map<std::string, size_t>>;
int main()
{
{
Data data(1000);
std::iota(data.begin(), data.end(), 0.0); // fill with sample data
float* element = &data[rand() % data.size()]; // pick random element
std::cout << "Random pick: " << *element << " at " << element << "\n";
std::ofstream ofs("filename", std::ios::binary);
boost::archive::binary_oarchive oa(ofs);
oa << data << ConvolutedIndex{
{4,
{
{"foo", element - data.data()},
}},
};
} // also closes file, but more importantly, completes archive first
{
std::ifstream ifs("filename", std::ios::binary);
boost::archive::binary_iarchive ia(ifs);
Data newData;
ConvolutedIndex newMapa;
ia >> newData >> newMapa;
std::cout<< "The element recovered: " << newMapa.at(4).at("foo") << "\n";
}
}
现在每个人都很高兴(好吧,除了Gods of <random>,但读者需要做一些练习):
Random pick: 383 at 0x1bd930c
The element recovered: 383