【发布时间】:2016-10-29 13:02:37
【问题描述】:
我想在硬盘上存储一个巨大的std::list<my_big_struct>(但在本例中很少)。
此外,我还想将许多std::list<std::list<my_big_struct>::const_iterator> 存储到硬盘上。
如何在没有深拷贝的情况下存档(会用完空间)?
下面是一个简短的例子,my_big_struct 是一个简单的int。
#include <list>
#include <fstream>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/list.hpp>
#include <boost/archive/binary_oarchive.hpp>
typedef int my_big_struct;
int main()
{
std::list<my_big_struct> a = {3,2,7,4,9};
std::list<std::list<my_big_struct>::const_iterator> aa;
std::list<std::list<my_big_struct>::const_iterator> ab;
std::list<my_big_struct>::const_iterator find = a.begin();
aa.emplace(aa.begin(), find++);
ab.emplace(ab.begin(), find);
{
std::ofstream f("test_a.bin", std::ios::binary);
boost::archive::binary_oarchive o(f);
o << a; // OK
}
// how to store aa and ab onto harddisk without hardcopy ???
}
【问题讨论】:
-
我不明白你的问题,如果没有将数据深度复制到硬盘驱动器,硬盘驱动器应该如何保存信息?否则,如果您不制作数据,数据就会丢失。
-
没有存储迭代器的好方法,因为没有它们的原始集合它们就毫无意义。 (迭代器用于 iteration 并且通常应被视为瞬态。)存储偏移量 (
std::distance),然后在您读回列表时存储std::advance。 -
a
std::list<my_big_struct>::const_iterator只是指向my_big_struct所在的堆内存中的位置。如果您随后尝试将其存储在磁盘上并稍后再次将其加载回来,那么堆内存中的位置将发生变化,因此您的所有迭代器都将无效。
标签: c++ serialization boost boost-serialization