2

让我先声明一下,我的大部分背景都是函数式编程语言,所以我对 C++ 相当陌生。

无论如何,我正在处理的问题是我正在解析具有多种变量类型的 csv 文件。数据中的示例行如下所示:

"2011-04-14 16:00:00, X, 1314.52, P, 812.1, 812"
"2011-04-14 16:01:00, X, 1316.32, P, 813.2, 813.1"
"2011-04-14 16:02:00, X, 1315.23, C, 811.2, 811.1"

所以我所做的是定义了一个存储每一行​​的结构。然后这些中的每一个都存储在 std::vector<mystruct> 中。现在说我想通过第 4 列将这个向量子集化为两个向量,其中每个包含 P 的元素都在一个向量中,而 C 在另一个向量中。

现在我给出的例子已经相当简化了,但实际问题涉及到多次子集。

我最初的幼稚实现是遍历整个向量,创建由新向量定义的各个子集,然后对这些新创建的向量进行子集化。也许更节省内存的方法是创建一个索引,然后将其缩小。

现在我的问题是,就速度/内存使用而言,是否有更有效的方法来执行此操作,或者通过这个 std::vector< mystruct > 框架,或者是否有更好的数据结构来处理这种类型的事情。

谢谢!

编辑:

基本上我想要的输出是前两行和最后一行。另一件值得注意的事情是,通常数据集不像示例那样排序,因此 Cs 和 Ps 没有分组在一起。

4

3 回答 3

1

我为此使用了std::partition。不过,这不是提升的一部分。

于 2013-04-03T18:34:44.130 回答
0

如果您想要一个允许您在不同实例之间廉价移动元素的数据结构,那么您正在寻找的数据结构就是std::list<>它的splice()函数系列。

于 2013-04-03T18:36:19.667 回答
0

我知道您这样做本身并没有麻烦,但您似乎担心内存使用和性能。

根据结构的大小和 csv 文件中的条目数,如果您不需要修改分区数据以便mystruct不复制对象,则建议使用智能指针:

typedef std::vector<boost::shared_ptr<mystruct> > table_t;
table_t cvs_data;

如果您使用 std::partition (如另一张海报所建议的那样),您需要定义一个谓词,该谓词采用 in 的间接性shared_ptr

于 2013-04-03T22:10:15.647 回答