3

我想在我的代码中使用一些小型 C++ 库,这将允许执行以下操作:

DataStore ds;
ds.open("data.bin");
int num=5;
std::string str="some text";
ds.put("key1",num);
ds.put("key2",str);
ds.get("key1");// returns int(5)
ds.get("key2");// returns std::string("some text")

使用风格不必与该代码示例相同,但原则应保持不变(获取/设置任何类型的值并将其存储在文件 blob 中)。该库也不应该是基于 SQL 的,也不应该是 SQL 包装器。什么是这样的库,它们的优点是什么?

编辑:将使用最多 10k 个密钥,大约。每个键 100 字节数据,文件不需要在计算机或操作系统之间移植,文件不应该可以用文本编辑器编辑(如果不是,它看起来更专业)并且不需要多线程感知。

4

2 回答 2

5

您的一种选择是使用BerkeleyDB及其C APIC++ APIC++ STL API

BekeleyDB 占用空间小、速度快、成熟且健壮。BerkeleyDB 的另一个优点是大多数脚本语言(如 Python、Perl 等)都绑定到它,因此您可以使用它们来操作(检查、可视化)数据。

缺点是您可以在其中存储的所有内容都是键值对,其中键和值都是字符串(或者更确切地说是 blob),因此您必须从 C++ 数据类型转换为字符串/blob。

于 2013-05-01T10:57:18.470 回答
2

创建一个以基本方式完成您描述的类并不难。您所需要的只是一些可以读/写密钥的功能,一个“这是什么类型”的标签[如果我们假设存储的数据不是很大,也许结合存储数据的大小-我的意思是一些MB每件左右]。您可能会发现具有某种“索引结构”或“下一个元素在哪里”位置引用的帮助。

你的显示方式有一个小问题ds.get(std::string):你实际上不能从同一个函数返回 anint和 a 。std::string您可以编写一个以 astd::string作为引用的函数,以及另一个以 a 作为引用的函数,int或类似的函数。

如果您需要有许多键,它会变得更有趣 - 此时,您可能需要某种哈希或二叉树类型的组织来搜索键。10k 键可能没什么大不了的 - 如果您按排序顺序存储它们,它会变得更容易。

文件不应该用文本编辑器编辑(如果不是,它看起来更专业)

我必须说,我不同意这一点。我发现文本可编辑文件看起来非常专业。它是二进制的事实只会让事情变得尴尬,并且如果应用程序中的某些东西不能按你希望的那样工作(例如它存储了安装路径,你移动了它,它就不再工作了,因为你不能启动它,它将不允许您编辑该配置)。

于 2013-05-01T11:38:44.993 回答