如何初始化一个包含常量元素的C++数组

17

我需要一种初始化数组中const元素的方法,因为我正在编写的程序需要这样做。问题在于,我必须使用函数来初始化这些元素,无法像这样简单地完成:

const int array[255] = {1, 1278632, 188, ...};

因为我需要生成大量数据。 我尝试使用memcpy将数据复制到const int中,但这不起作用,而且一直都不起作用。

 const int array[255];

 void generateData(){
      for(int i = 0; i < 255; i++) {
          initializeSomehowTo(5, array[i]);
      }
 }

我希望您能理解我所说的话,如果我重复了问题,请见谅,可能是我没注意到。


6
你不能使用 const int array[255] = initializeMyArray(),但如果你使用了 std::array,你可以这样写:const std::array<int, 255> = initializeMyArray() - Justin
3个回答

20

这个怎么样?

#include <array>
typedef std::array<int, 255> Array;

const Array array = generateData();

Array generateData(){
    Array a;
    for(int i = 0; i < a.size(); i++) {
        initializeSomehowTo(a[i]);
    }
    return a;
}

这个很好用,唯一的问题是 const int array[10][10][10]; 看起来真的很吓人:const std::array<std::array<std::array<int, 10>, 10>, 10> Array; ;-) - Darius Duesentrieb

6

最简单的方法是从一个函数中获取填充好的数组,并使用它来初始化您的const(或constexpr)对象。然而,内置数组无法复制,但是std::array<T,N>可以:

std::array<T, 255> array = initializeData();

如果你需要一个内置数组,我可以想象初始化一个类(实际上是模板)的静态成员,其中索引从 std::make_index_sequence<255> 扩展出来,并在数组中用作位置参数,即以下内容:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <utility>

int some_function(std::size_t i) { return i; }

template <typename> struct initialized_array_base;
template <std::size_t... I>
struct initialized_array_base<std::index_sequence<I...>> {
    static const int array[sizeof...(I)];
};

template <std::size_t... I>
int const initialized_array_base<std::index_sequence<I...>>::array[sizeof...(I)]
    = { some_function(I)... };

struct initialized_array
    :initialized_array_base<std::make_index_sequence<256>> {
};

int main() {
    std::copy(std::begin(initialized_array::array),
              std::end(initialized_array::array),
              std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
}

4
哇,看起来这么简单的任务却让人感到害怕啊;-) - zett42

3
你可以创建一个可写数组,对其进行初始化,然后创建一个常量引用。
int arry[255];

void generateData(){
  for(int i = 0; i < 255; i++) {
      initializeSomehowTo(5, arry[i]);
  }
}

const int (&array)[255] = arry;

这并不会阻止 arry 被修改,对吧? - Arun
我认为你也可以使用std::static_cast转换为一个const引用。 - Brady Dean
额外的间接层(对于具有静态存储的引用变量)可能无法优化掉。我绝对建议不要使用这个,因为从初始化函数返回std::array<>可以避免任何性能下降。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接