将所有数组元素设置为整数

时间:2010-07-29 02:44:45

标签: c++

我有一个数组,

int a[size];

我想将所有数组元素设置为1

因为数组中的某些索引已经设置为1所以最好使用条件语句检查每个元素,如

for (int index = 0; index < size; index++)
{
    if (a[index] != 1)
      a[index] = 1;
}

或设置所有索引无论如何。会有什么区别?

6 个答案:

答案 0 :(得分:15)

您的代码在循环中有两个路径,具体取决于每个值:

  1. 从数组,比较和分支中读取
  2. 从数组中读取,比较和写入
  3. 这不值得。写一下。

    如果您愿意,可以通过拨打

    来执行相同的操作
    std::fill(a, a + size, 1);
    

    如果数组的类型为char而不是int,则可能会调用memsetfill的特定于平台的实现可以提供编译器优化提示。

答案 1 :(得分:14)

将所有元素设置为1.首先是简单和可读性的代码。如果您发现代码运行速度太慢,请对其进行分析以查看需要进行哪些改进(尽管我非常怀疑性能问题可能来自将整数数组的元素设置为某个值)。

答案 2 :(得分:5)

我猜你只是在寻求理解,而不是在与一个真正的性能问题作斗争...这只是不会出现在测量中,这就是为什么:

通常,每当缓存的内存处理器(即当今大多数台式机CPU)必须向内存写入值时,必须从(相对较慢的)RAM中读取包含该地址的缓存行。然后通过CPU写入缓存来修改该值。整个缓存行最终写回主RAM。

当您在一系列连续地址(如阵列)上执行操作时,CPU可以在写回之前在一个缓存行上非常快速地执行多个操作。然后它移动到下一个缓存行,该缓存行之前是预期获取的。

最有可能在写入值之前执行测试与仅仅写入有多种不同之处有几个原因:

  1. 分支预测使此过程非常有效。
  2. 编译器将进行一些非常强大的优化。
  3. 将内存传输到缓存RAM将是真正的速率确定步骤。
  4. 因此,为了清晰起见,请编写代码。如果你仍然好奇,请测量差异。

答案 3 :(得分:3)

改为使用std::vector

#include <vector>
...
std::vector<int> a(10, 1);

// access elements just as you would with a C array

std::cout << "Second element is: " << a[1] << std::endl;

现在你有一个10个整数的数组都设置为1.如果你已经有一个初始化的向量,即一个填充了除1之外的值的向量,你可以使用fill,如下所示:

#include <algorithm>
...
std::fill(a.begin(), a.end(), 1);

答案 4 :(得分:0)

除非size是一个非常大的值,否则我不希望会有明显的差异 - 但是,如果你想要最佳变量,那么只需将所有值设置为1将是更高效的选项 - 我确信条件将比简单的赋值花费更多的时间,即使那时认为不需要赋值。

答案 5 :(得分:0)

使用C ++ 11,您可以使用基于范围的for来设置所有值:

int a[size];
for(auto &v: a) {
    v = 1;
}

&v通过引用进行迭代,因此循环变量是可分配的。

这种格式是std::fill的一个很好的替代品,如果赋值是一个更复杂的表达式,那么它真的会自成一体。