【问题标题】:Initializing array of fundamental types初始化基本类型数组
【发布时间】:2016-01-23 19:36:53
【问题描述】:

创建基本类型的数组时,例如:

double *aPtr = new double[10];

有没有办法将其初始化为特定值? ((ex)-1)

创建一个新类是唯一的方法吗?

【问题讨论】:

  • 您的意思是,用特定的相同值初始化数组中的每一个双精度数?
  • 是的,先生。是真的伊苏卡。
  • 为什么不std::vector

标签: c++ types initialization


【解决方案1】:

fill_n 函数可以是您正在寻找的。它将为数组的前 n 个值分配一个特定的值。

double *aPtr = new double[10];

std::fill_n(aPtr, 10, -1); // Fill the aPtr array with the value -1 for the 10 first values.

我不知道在声明时直接用一个相同的值填充它的具体方法。

【讨论】:

    【解决方案2】:

    你可以使用std::fill_n:

    std::fill_n(aPtr , 10, -1);
    

    【讨论】:

      【解决方案3】:

      您可以使用统一初始化将基本类型初始化为零。

      double *aPtr = new double[10] {}
      

      这会将创建的数组清零。您也可以在 C++03 中使用“()”而不是“{}”来执行此操作。

      但是,这不会将所有元素初始化为特定值。如果你写new double[10] {-1.0},你会得到一个数组,第一个元素是-1.0,其他九个元素是0.0

      您可以使用像这样的初始化列表来指定所有元素,但它对于大型数组是不可扩展的。相反,我相信在调用new 之后使用std::fill_nstd::fill 是更好、更简单的解决方案。

      如果您真的不想有循环(即使在算法内部),您可以使用可变参数模板来生成初始化列表,但这需要一些工作才能使其正常工作。

      【讨论】:

        【解决方案4】:

        对于这么小的数组,你可以显式编写

        double *aPtr = new double[10] 
        { 
            ex -1, ex -1, ex -1, ex -1, ex -1, ex -1, ex -1, ex -1, ex -1, ex -1 
        };
        

        但是对于更大的数组,您应该使用一些标准算法,例如 std::generatestd::generate_nstd::fillstd::fill_nstd::for_each 甚至某种循环。

        例如

        std::generate( aPtr, aPtr + 10, [value = ex - 1]{ return value; } );
        

        std::generate_n( aPtr, 10, [value = ex - 1]{ return value; } );
        

        std::fill( aPtr, aPtr + 10, ex - 1 );
        

        std::fill_n( aPtr, 10, ex - 1 );
        

        std::for_each( aPtr, aPtr + 10, [value = ex - 1]( auto &x ){ x = value; } );
        

        如果编译器不支持初始化捕获你可以写例如

        std::generate( aPtr, aPtr + 10, [=]{ return ex - 1; } );
        

        【讨论】:

        • 认为当 OP 写“ex -1”时,他的意思是“例如,-1” - 不过我可能是错的......
        • @PaulR 我认为这不是很重要。:)
        • 是的 - 我只是觉得这可能会让其他阅读本文的人有点困惑。
        【解决方案5】:

        如果你想初始化双精度数组并将值设置为 0,你可以使用:

        double* aPtr = (double*)calloc(10,sizeof(double));

        如果你想在声明后设置元素的值,你可以使用:

        double *aPtr = new double[10]; memset(aPtr,value,size);

        同样的问题和你的详细回答:

        using memset in double type array

        【讨论】:

        • 问题是在 C++ 星球上而不是 C
        • double *aPtr = new double[10]();
        • c & c++ 在内存分配上没有差异,在你使用calloc 后你可以调用 aPtr[1] = 10。对于 c++ 我链接到一个答案
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-13
        • 1970-01-01
        • 2012-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多