我有大量的物体(大约30k)。存储和访问它们的最佳方法是什么?它们都有一个特定的ID,但我也希望用它们的名称,类别等来过滤和搜索它。它是一个非常简单的类,如下所示:
class objclass {
int id;
std::string name;
...
}
我在想SQL,但我不知道这是不是最好的方法。
提前致谢! :)
更新:Thx Guys!我想我会选择一个矢量。并且thx澄清30k不是那么大^^对我来说,从未处理过如此数量的数据它似乎相当大;)
答案 0 :(得分:2)
std::vector
听起来非常合适。如果您事先知道自己获得了多少元素,请使用vector::reserve
或vector::resize
进行全面分配。否则,在大量插入后使用vector::shrink_to_fit
。
要加快id
上的搜索,请对其vector
进行排序并使用binary_search/lower_bound
。
如果您有许多具有相同内容的字符串,请使用flyweight类。这也可以大大加快字符串比较。
要快速搜索字符串成员,请在容器中获取vector
个迭代器并对其进行排序或选择boost::multi_index
。
一个小的计算来支持它:假设int
是4个字节,你的字符串平均20个字母,30 000个元素,大约2兆字节。无需担心。
答案 1 :(得分:1)
30.000个对象实际上不是“非常大的数字”。只要对象本身的大小不是几KB,整个集合仍然可以很容易地适应RAM,所以没有理由因为大小而使用数据库。
您可以将它们全部存储在std::vector
中。当您需要有效地搜索它们时,您可以为要搜索的每个字段创建std::map
或std::multimap
,以便将值映射到对象的引用。
但是,除了数据量之外,还有其他原因可以使用数据库。例如,当您有其他程序(或同一程序的多个实例)对同一数据进行操作并希望在它们之间保持数据同步时。或者当你只想要一个可靠的持久层时。选择哪个数据库真的取决于您。您的要求(就您所写的而言)非常通用,任何数据库系统都应该能够充分处理它们。您的项目可能会有一些方面使某些数据库比其他数据库更合适,但您没有提及任何数据库。
答案 2 :(得分:0)
某些SQL数据库可能会没问题。 30k不是“非常大的数字”,是什么让你认为它是?
除非您的过滤条件非常复杂,否则您也可以考虑将所有内容保存在内存中。那就是如果你不需要某种持久性,但你的要求非常模糊。
所以:如果你想方便我选择SQL,如果速度非常重要我会选择内存版本和自定义过滤器。但这取决于您拥有的数据类型以及许多其他因素。
答案 3 :(得分:-1)
你应该找到最适合你的方式。 SQLite,MySQL数据库可用于C ++的大型数据库需求
答案 4 :(得分:-3)
我认为创建数据库是最好的。