【问题标题】:fill_n() is not letting change variable valuefill_n() 不允许更改变量值
【发布时间】:2015-05-26 15:56:33
【问题描述】:

我正在使用 fill_n() 函数来初始化我的数组值,但是我无法更改数组的值,它始终是初始值。

谁能解释一下这是为什么?

#include<iostream>
#include<ctime>


int main(){

    //Matrix 
    int m[3][3] = {{1,0,0},{0,1,0},{0,0,1}};
    int v[3] = {5,6,7}; 
    int result[3];// = {0,0,0};
    int n = 0, i, j;

    std::fill_n(result,sizeof(result),0);

    clock_t time = clock();

    while(n<1000){
        n++;
        for(i=0;i<3;i++){
            for(j=0;j<3;j++){
                result[j] = result[j]+(v[i]*m[j][i]); //changing the values here.
            }
        }
    }

    time = clock() - time;

    for(i=0;i<3;i++){
    std::cout<<result[i]<<"\n";
    }

    std::cout<<"Execution time: "<<((float)time)/CLOCKS_PER_SEC<<"\n";

    return 0;
}

代码的输出总是0。

【问题讨论】:

    标签: c++ arrays initialization


    【解决方案1】:

    std::fill_n(result,sizeof(result),0); 您要求将第一个 sizeof(result) 元素填充 0。

    但是,result 中只有 3 个元素可用。因此,您编写越界并导致未定义的行为。你应该改写std::fill_n(result, sizeof(result) / sizeof(result[0]), 0);

    请注意,sizeof(result)bytes 中返回 result 的大小,而不是在 元素 中。

    【讨论】:

      【解决方案2】:

      sizeof(result) 返回变量result 保存的字节数。由于result 是一个由 3 个ints 组成的数组,它在内存中的大小为3 * sizeof(int),它(除非sizeof(int)1)比3 大得多。因此,您正在编写传递数组边界并引发未定义的行为。

      计算大小的实际方法是将result 的整个大小除以其元素类型。即sizeof(result) / sizeof(int)

      如果你想将每个元素初始化为0,一个更简单的方法是value-initialize数组:

      int result[3]{}; // or = {} (pre C++11)
      

      【讨论】:

        【解决方案3】:

        type 类型的 array 的元素数(或大小)将为 sizeof(array) / sizeof(type )。 fill_n 所需的第二个参数是填充容器的元素数(在您的情况下,是 int 类型的数组),而不是数组的大小(以字节为单位)。当然,sizeof(array) 返回 sizeof(type) 乘以元素数。

        【讨论】:

          猜你喜欢
          • 2010-12-20
          • 2022-06-12
          • 2012-03-23
          • 2013-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-10
          • 2013-04-17
          相关资源
          最近更新 更多