我的程序中有一些动态队列,可以在处理过程中在后面或中间添加元素/从前面删除元素,一旦处理完成就永远不会将元素存储在内存中。但是我想记录/序列化序列的动态状态,包括出于自省目的而删除的所有元素。
例如
struct element1{};
struct element2{};
std::deque<element1> v1;
std::deque<element2> v2;
if(some_cond1)
{
v1.push_back(element1{});
//log v1.back()
v1.push_back(element1{});
//log v1.back()
}
if(some_cond2)
{
v2.push_back(element2{});
//log v2.back()
v2.push_back(element2{});
//log v2.back()
}
if(another_cond)
{
v1.pop_front();//presently I am not logging removal of elements
v2.pop_front();
}
if(a_third_cond)
{
v1.insert(some_pos,element1{});
//log v1,some_pos
}
我正在寻找两种替代解决方案。
- 是否有一些数据格式(比如 JSON)允许数组/对象分布在不同的位置并通过一些唯一的名称/ID 引用,因为我没有保留内存中准备好的所有元素以写入文件并仅记录部分我去的顺序?
例如
{
"v1" : [],
"v2" : [],
append("v1"):
[
"elem1_v1", "elem2_v1"
],
append("v2"):
[
"elem1_v2", "elem2_v2"
],
insert("v1",1):
[
"elem3_v1"
]
}
- 是否可以将多个不同的位置写入单个文件,以便每个序列跟踪自己的位置并写入该位置,以便最终结果是简单的连续序列描述?(我能想到的只是文件支持的 SGI 绳索实现)
在这种情况下,最终结果可能如下所示,
{
"v1" : ["elem1_v1","elem3_v1","elem2_v1"],
"v2" : ["elem1_v2","elem2_v2"]
}
当然,以一种粗略的方式,我可以将所有元素记录在一个平面文件中,并以一些信息为前缀,例如哪个序列和位置,然后在整个文件中搜索它们以重建它们。但是,如果可以处理此类问题,我正在寻找一种更强大、更结构化的替代方案。