c++ jak zainicjalizować elementy const tablicy

Potrzebuję sposobu na zainicjalizowanie elementów tablicy dla programu, nad którym aktualnie pracuję. Problem polega na tym, że muszę zainicjalizować te elementy za pomocą funkcji, nie ma sposobu, aby to zrobić w ten sposób:

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

Ponieważ jego dużo danych muszę wygenerować. To co próbowałem to memcpy DANE do const int, ale to nie może działać i nie działa.

 const int array[255];

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

Mam nadzieję, że rozumiesz, co próbuję, przepraszam, jeśli podwoiłem pytanie, musiałem przeoczyć to.

Author: Darius Duesentrieb, 2017-06-06

3 answers

Co ty na to?

#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;
}
 17
Author: Arun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-05 23:01:40

Najprostszym sposobem jest pobranie wypełnionej tablicy z funkcji i użycie jej do zainicjalizowania obiektu const (lub constexpr). Jednak wbudowane tablice nie mogą być kopiowane, ale std::array<T, N> be:

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

Jeśli potrzebujesz wbudowanej tablicy, mogę sobie wyobrazić inicjalizację static członka klasy (w rzeczywistości szablonu), gdzie indeks jest rozwijany z indeksów rozszerzonych z std::make_index_sequence<255> i używany jako argument pozycyjny w tablicy, tzn. coś w następujący sposób:

#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';
}
 6
Author: Dietmar Kühl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-05 22:55:26

Możesz utworzyć tablicę zapisywalną, zainicjować ją, a następnie utworzyć do niej odniesienie const.

int arry[255];

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

const int (&array)[255] = arry;
 3
Author: Amadeus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-05 23:00:11