2017-06-05 23 views
15

現在作業中のプログラムの配列のconst要素を初期化する方法が必要です。 問題は、私は機能と、これらの要素を初期化する必要がある、このようにそれを行うための方法はありません。C++配列のconst要素を初期化する方法

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

データのそのたくさんiが生成する必要があるため。 私が試したのは、const intのデータにmemcpyのデータですが、それはうまく動作せず、機能しませんでした。

const int array[255]; 

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

私はあなたが私は、私が質問を倍増している場合、私はそれを見落としている必要があります申し訳ありませんしようとしています何を理解してほしいです。

+5

あなたは[255] = initializeMyArray() ''のconst int型の配列を行うことはできませんが、あなたは 'のstd :: array'を使用した場合、あなたは'のconstの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 array [10] [10] [10]; ** const std :: array ,10 >、10> Array; ** ;-) – Tsoj

6

最も簡単な方法は、関数から満たされた配列を取得し、あなたのconst(またはconstexpr)オブジェクトを初期化するためにそれを使用することです。ただし、組み込みの配列をコピーすることはできませんが、std::array<T, N>こと:

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

あなたは組み込みの配列が必要な場合は、私はインデックスである(実際には、テンプレート、)クラスのstaticメンバーを初期化する想像することができますあなたはそれをconst参照を作成し、その後、書き込み可能な配列を作成し、それを初期化し、できる

#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

このような単純なタスクに恐怖を感じるWOW :-) – zett42

3

:インデックスから展開、すなわち、これらの線に沿って何かをstd::make_index_sequence<255>から展開し、配列内の位置の引数として使用。

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 <>'を返すとパフォーマンスが低下することはないので、この**を使用しないことをお勧めします。 –

関連する問題