C++;从自定义结构向量中高效提取子集 让我在下面陈述一下我的大部分背景都是用函数式编程语言,所以我相当初级C++。
无论如何,我正在处理的问题是,我正在解析具有多种变量类型的csv文件。数据中的采样线如下所示:C++;从自定义结构向量中高效提取子集 让我在下面陈述一下我的大部分背景都是用函数式编程语言,所以我相当初级C++。,c++,boost,std,C++,Boost,Std,无论如何,我正在处理的问题是,我正在解析具有多种变量类型的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中。现在,假设我想
"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基本上,我想要的输出分别是前两行和最后一行。另一件值得注意的事情是,数据集通常不像示例那样排序,因此Cs和Ps没有分组在一起 我用过这个。但是,它不是boost的一部分。如果您想要一种能够在不同实例之间廉价移动元素的数据结构,那么您要寻找的数据结构是
std::list
,它是splice()
函数系列。我知道您在执行此操作时本身没有问题,但您似乎很关心内存使用和性能
根据结构的大小和csv文件中的条目数,如果不需要修改分区数据,则最好使用智能指针,以便不复制mystruct
对象:
typedef std::vector<boost::shared_ptr<mystruct> > table_t;
table_t cvs_data;
typedef std::vector table\t;
表t cvs数据;
如果您使用std::partition(正如另一张海报所建议的那样),您需要定义一个谓词,该谓词将
共享的ptr
的间接性纳入考虑。您能否编辑您的帖子,并将您提供的示例的所需最终状态放入其中?如果我理解正确,在将第一个向量子集为两个向量(由P和C分割)后,将在一个向量中得到前两行,在另一个向量中得到第三行?可能在这里很有用这看起来很有希望,所以std::partition返回一个迭代器,所以假设我想再次将std::partition的输出子集。这是否意味着我需要从迭代器创建一个新的向量,然后重复?或者我还能做些什么?谢谢它对向量进行排序,然后返回两个组之间的边界位置。使用向量的范围构造函数构造任意子集的新向量很简单。如果你存储的是整个对象而不是指向对象的指针,那么复制副本可能是相当浪费的。我忘了提到,如果你不想创建一个新的向量,你也可以对任何一个子集使用分区。它只是将两个组中的任何一个分组。祝你好运