gpt4 book ai didi

c++ - 序列化结构的 STL 映射

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:47:24 25 4
gpt4 key购买 nike

我正在尝试序列化一个 STL 映射,其中键和值是结构。当键是一个结构并且值是一个 int 时,附加的代码工作正常。但是,我在设置序列化函数来处理结构值时遇到问题。有关如何执行此操作的任何建议?

非常感谢 - 安德鲁。

#include <string>
#include <fstream>
#include <algorithm>
#include <map>
#include <unordered_map>
#include <iostream>
#include <chrono>
#include <sstream>
#include <functional>

#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/serialization/utility.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/unordered_map.hpp>
#include <boost/serialization/version.hpp>

using namespace std;

struct portfolio_data {
double a;
};

struct portfolio_key {
long id;
string name;
};

struct portfolio_compare
{
bool operator() ( portfolio_key k1, portfolio_key k2 ) const
{
return (
( k1.id < k2.id ) ||
( ( k1.id == k2.id ) && ( k1.name < k2.name ) )
);
}
};

typedef map<portfolio_key, int, portfolio_compare> portfolio_map;

//------------------------------------------------------------------------

template<class Archive>
void serialize( Archive& ar, portfolio_key& key, const unsigned int version )
{
ar & boost::serialization::make_nvp( "id", key.id );
ar & boost::serialization::make_nvp( "name", key.name );
}

//------------------------------------------------------------------------

void save( portfolio_map& map_var, const std::string& file_name )
{
ofstream ofs( file_name.c_str(), ios::out | ios::binary );
boost::archive::binary_oarchive ba( ofs ); // works for text too
ba << BOOST_SERIALIZATION_NVP( map_var );
}

//------------------------------------------------------------------------

portfolio_map load( const std::string& file_name )
{
portfolio_map map_var;
ifstream ifs( file_name.c_str(), ios::in | ios::binary );
boost::archive::binary_iarchive ba( ifs );
ba >> BOOST_SERIALIZATION_NVP( map_var );
return map_var;
}

//------------------------------------------------------------------------

int main( void )
{
portfolio_map map1;

for ( long i = 0; i < 10; ++i )
{
portfolio_key k;
k.id = i;
k.name = "AAAAA";

portfolio_data d;
map1[k] = i;
}

save( map1, "map.bin" );

portfolio_map map2;
map2 = load( "map.bin" );

cout << map2.size() << endl;
}

最佳答案

你只是忘了为你的值结构定义serialize,仅此而已:

template<class Archive>
void serialize( Archive& ar, portfolio_data& value, const unsigned int version )
{
ar & boost::serialization::make_nvp( "a", value.a );
}

关于c++ - 序列化结构的 STL 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34159922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com