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

C++ efficiently extracting subsets from vector of user defined structure

本文关键字:向量 提取 子集 结构 有效地 用户 定义 c++      更新时间:2023-10-16

让我先声明一下,我的大部分背景都是函数式编程语言,所以我对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。现在我想把这个向量的第4列子集分成两个向量其中每个包含P的元素都在一个向量中,而C在另一个向量中。

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

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

现在我的问题是,是否有一种更有效的方法,在速度/内存使用方面)通过这个std::vector框架,或者是否有更好的数据结构来处理这类事情。

谢谢!

编辑:

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

我使用了std::partition。但它不是boost的一部分

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

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

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

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

如果您使用std::partition(如另一位海报所建议的),您需要定义一个谓词,该谓词将shared_ptr的间接性考虑在内。