C ++从用户定义结构的向量中有效地提取子集

时间:2013-04-03 18:17:44

标签: c++ boost std

让我先说明我的大部分背景都是函数式编程语言,所以我对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不会组合在一起。

3 个答案:

答案 0 :(得分:1)

我已经使用std::partition了。但这不是提升的一部分。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

如果你使用std :: partition(作为建议的另一张海报),你需要定义一个谓词,将shared_ptr的间接转换为accont。