6

我分配了一个大的双向量,假设有 100000 个元素。在我的代码中的某个时刻,我想将所有元素设置为一个恒定的非零值。如何在不对所有元素使用 for 循环的情况下做到这一点?如果有帮助,我也在使用 blas 包。

4

3 回答 3

9

您可以使用std::fill( #include <algorithm>):

std::fill(v.begin(), v.end(), 1);

当然,这本质上也只是一个循环..

于 2011-03-10T13:40:57.760 回答
3

“填充”与您所说的一样。

请注意,也可以构造一个充满指定值的向量:

std::vector<double> vec(100000, 3.14);

因此,如果“在某个时候”的意思是“在施工后立即”,请改为这样做。此外,这意味着您可以这样做:

std::vector<double>(100000, 3.14).swap(vec);

如果“在某个时候”意味着“在更改大小后立即”,并且您希望/希望重新分配向量(如果您要使其大于其先前容量,则“期望”,“想要”如果您'让它变得更小,并希望它被修剪以节省内存)。

于 2011-03-10T14:08:23.370 回答
0

memset()如果你不想循环,你总是使用。

也就是说,memset(myarr, 5, arrsize);为了用所有 5 填充它。谨防隐式转换为无符号字符。

概要

 #include <string.h>

 void *
 memset(void *b, int c, size_t len);

描述

 The memset() function writes len bytes of value c (converted to an
 unsigned char) to the byte string b.

如果向量很大,并且您需要它快速运行并且您正在使用 gcc,那么:

块移动(memcpy)和块集(memset)的代码生成被重写。GCC 现在可以根据要复制的块的大小和要优化的 CPU 来选择最佳算法(循环、展开循环、带有 rep 前缀的指令或库调用)。

于 2011-03-10T13:46:00.487 回答