c语言中过滤数组的智能方法

c语言中过滤数组的智能方法,c,arrays,performance,C,Arrays,Performance,我目前正在用c语言编程,我想知道是否有一种聪明的方法可以过滤一个数组,使另一个数组满足某些条件 一个例子是: 给定一个大小为10的随机整数数组,生成一个仅包含该数组中偶数的数组 因为很难知道有多少元素满足条件,所以我在数组中检查了两次,一次是计算满足条件的元素的数量,然后实际将相应的元素放入数组中 我尝试的另一件事是创建一个大小为10的整数数组,存储第一次运行时满足条件的所有索引,然后在将所需元素复制到数组中时读取所需索引数组中的元素 一般来说,数组可能很大,检查条件可能很昂贵,所以我认为这种方

我目前正在用c语言编程,我想知道是否有一种聪明的方法可以过滤一个数组,使另一个数组满足某些条件

一个例子是: 给定一个大小为10的随机整数数组,生成一个仅包含该数组中偶数的数组

因为很难知道有多少元素满足条件,所以我在数组中检查了两次,一次是计算满足条件的元素的数量,然后实际将相应的元素放入数组中

我尝试的另一件事是创建一个大小为10的整数数组,存储第一次运行时满足条件的所有索引,然后在将所需元素复制到数组中时读取所需索引数组中的元素

一般来说,数组可能很大,检查条件可能很昂贵,所以我认为这种方法不太合适


我觉得应该有更聪明、更有效的方法来做到这一点。你能帮我个忙吗?

一般来说,在性能方面,你需要权衡速度和内存

在双循环版本中,您是在为内存牺牲速度,而在单循环版本中,您是在为速度牺牲内存

您可以尝试一些类似于每隔这么多元素动态分配空间的方法。例如,您分配了5个元素的空间,当空间满时,您再分配5个元素,依此类推。不幸的是,动态分配空间会占用大量时间


除了你所描述的方法之外,我不知道还有什么其他的方法,尽管可能有一些方法。例如,在C++中,可以使用向量,它自动调整大小以接受与我所描述的方法类似的新值。

< P>一般而言,在性能方面,您有一个速度记忆权衡。

在双循环版本中,您是在为内存牺牲速度,而在单循环版本中,您是在为速度牺牲内存

您可以尝试一些类似于每隔这么多元素动态分配空间的方法。例如,您分配了5个元素的空间,当空间满时,您再分配5个元素,依此类推。不幸的是,动态分配空间会占用大量时间


除了你所描述的方法之外,我不知道还有什么其他的方法,尽管可能有一些方法。例如,在C++中,可以使用向量,它自动调整自身大小以接受与我所描述的方法类似的新值。 每次获得满足条件的元素并将该元素添加到动态分配的整数数组中时。 使用realloc增加指针指向的int数组的大小,并将新元素添加到该数组中。
使用计数器了解数组中的元素数。

为int动态分配内存。 每次获得满足条件的元素并将该元素添加到动态分配的整数数组中时。 使用realloc增加指针指向的int数组的大小,并将新元素添加到该数组中。
使用计数器了解数组中的元素数。

假设最坏的情况,并分配足够的内存来复制整个数组?或者这不是一个合适的方法?对于原始数组的大小,你有一个很好的近似吗?你可以使用动态内存分配。C++之类的东西。顺便问一下,是否可以在CUDA中使用动态内存分配?假设最坏的情况,并分配足够的内存来复制整个阵列?或者这不是一个合适的方法?对于原始数组的大小,你有一个很好的近似吗?你可以使用动态内存分配。C++之类的东西。顺便问一下,在CUDA中可以使用动态内存分配吗?你不应该改为使用vector吗?@Vladp注意标记,这是c。对不起,但分配每个元素都是浪费,使用vector方法,每次分配更多1,2,4,8,。。。这样会便宜得多。你不应该改用vector吗?@Vladp注意标签,这是c。抱歉,但分配每个元素都是浪费,使用vector方法,每次分配1,2,4,8,。。。这样做要便宜得多。[…]尽管外面可能有些东西。在C++中,这将来自C++ 11中的标题……尽管可能有一些东西。在C++中……将来自C++ 11中的头文件。