Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;从自定义结构向量中高效提取子集 让我在下面陈述一下我的大部分背景都是用函数式编程语言,所以我相当初级C++。_C++_Boost_Std - Fatal编程技术网

C++;从自定义结构向量中高效提取子集 让我在下面陈述一下我的大部分背景都是用函数式编程语言,所以我相当初级C++。

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中。现在,假设我想

无论如何,我正在处理的问题是,我正在解析具有多种变量类型的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和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的输出子集。这是否意味着我需要从迭代器创建一个新的向量,然后重复?或者我还能做些什么?谢谢它对向量进行排序,然后返回两个组之间的边界位置。使用向量的范围构造函数构造任意子集的新向量很简单。如果你存储的是整个对象而不是指向对象的指针,那么复制副本可能是相当浪费的。我忘了提到,如果你不想创建一个新的向量,你也可以对任何一个子集使用分区。它只是将两个组中的任何一个分组。祝你好运