2017-06-05 181 views
15

我需要一种方法来初始化我目前工作的程序的阵列的常量元素的常量元素。 的问题是,我必须初始化函数这些元素,就没有办法做到这一点是这样的:C++如何初始化一个数组

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]); 
     } 
} 

我希望你明白我想,如果对不起,我加倍的问题,我必须忽略它。

+5

你不能这样做'const int的数组[255] = initializeMyArray()',但如果你使用'的std :: array',你可以做'常量的std ::阵列 = initializeMyArray()' – Justin

回答

17

这个怎么样?

#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; 
} 
+0

这个伟大的工程,唯一的事情就是** const int的数组[10] [10] [10]; **看起来很吓人的:**常量的std ::阵列<性病::阵列<性病::阵列,10 >,10>阵列; ** ;-) – Tsoj

6

最简单的方法是让从函数填充数组并用它来初始化const(或constexpr)对象。然而,内置阵列不能被复制,但std::array<T, N>是:

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

如果你需要一个内置阵列,我能想象初始化类的static成员(模板,实际上),其中指数从一个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; 
+0

这并不能阻止'arry'被修改,对吧? – Arun

+0

我认为你也可以将std :: static_cast改为const引用 –

+0

额外的间接级别(对于也有静态存储的引用变量)可能无法优化。 **我肯定会推荐不使用这个**,因为从初始化函数返回一个'std :: array <>'可以避免任何性能下降。 –