选择适当的STL容器来记录数据

时间:2011-04-20 06:49:44

标签: c++ stl

我需要在客户端服务器应用程序中使用日志记录和过滤机制。其中客户端可以根据某个参数请求日志数据。

日志将MACID,日期和时间,命令类型和方向作为字段。

服务器也可以根据这些参数过滤日志数据。 日志的大小为10 MB,之后日志将从开头覆盖消息。

我的方法是将数据作为“在内存中”在STL容器中记录到文件中,以便当客户端请求数据服务器根据任何条件过滤日志数据时

因此,服务器将首先对vector<>上的特定条件进行排序。然后使用二进制搜索过滤它。

我打算在内存记录数据中使用vector作为STL容器。

我对于矢量是否适合这种情况感到有点困惑。

因为向量中数据的大小最大可达10 mb。 我的问题是,矢量对于这种情况是否足够了?

3 个答案:

答案 0 :(得分:1)

我会选择一个双端队列。它就像一个向量,但你可以从两端添加/删除元素。

答案 1 :(得分:1)

我首先声明我会使用一个日志库,因为有很多,我向你保证他们会做得更好(log4cxx为ex)。如果你坚持这样做你自己一个向量是一个合适的机制,但你必须手动排序根据用户请求偏向的数据。另一个想法是使用sqllite并让它管理存储排序和过滤数据。

答案 2 :(得分:0)

实际响应将在很大程度上取决于使用模式和界面。如果您使用的是图形用户界面,那么很可能已经有一个小部件在某种程度上实现了该功能(能够按不同的列排序,甚至过滤)。如果你真的想在UI之外实现这个,那么它将取决于使用模式,用户是否希望特定视图比其他人更多?她只需要过滤,还是排序?

如果在大多数情况下会有一个数据视图,并且您只需要显示不同的订单几次,我会保留std::vectorstd::deque个元素,并在需要时使用remove_copy_if过滤掉。如果需要不同的排序,我将复制并对副本进行排序,以避免必须重新排序,以便继续向日志添加元素。请注意,如果应用程序不断推送您需要使用新元素更新副本所需的数据(或提供固定视图并定期重新运行操作)。

如果没有特定视图比其他视图更频繁发生,如果您不想经历上述实现的痛苦,请查看一个boost多索引容器。它们使用不同的标准保持相同数据的同步视图。在最后一种情况下,这可能是效率最高的,即使在一般主导视图的情况下效率可能较低,也可能使事情变得更简单,因此它仍然值得。