Совокупная инициализация массива структур с использованием массива - PullRequest
3 голосов
/ 15 мая 2019

В C ++ (14/17), как вы инициализируете (большой) массив структур без жестко закодированного в скобках списка инициализаторов?

Например, что вы делаете, если вам нужно большое количество инициализации или вы не знаете значения инициализации до времени выполнения? Там, кажется, нет поста об этом. Я создал простой пример того, что я надеялся сделать. Надеюсь, кто-то может объяснить, как это можно сделать:

struct myStruct
{
  int value;    

  myStruct(int input)
  { 
    value = input*input;
  }
};

int main()
{
  // option #1 - aggregate initialization
  myStruct array1[] {{1},{2},{3},{4},{5}};

  // option #2 - using available array (??)
  int input[5] = {1,2,3,4,5};  
  myStruct array2[] { input[] } ;  // something like this?

  return(0);
}

1 Ответ

2 голосов
/ 15 мая 2019

Если вы не знаете размер массива до времени выполнения, контейнер для использования будет std::vector<myStruct>. Однако для этого вам нужно иметь конструктор по умолчанию в myStruct.

Вы можете использовать std::transform для создания myStruct объектов из int значений и заполнения std::vector.

Демонстрационный код:

#include <vector>
#include <algorithm>

struct myStruct
{
   int value;    

   myStruct() : myStruct(0) {}

   myStruct(int input)
   { 
      value = input*input;
   }
};

int main()
{
   // option #2 - using available array (??)
   int input[5] = {1,2,3,4,5};  
   int size = sizeof(input)/sizeof(*input);

   // array2 has to be of the right size before the call to std::transform
   // std::transform does not call push_back. It simply assigns the value to
   // the dereferenced iterator.
   std::vector<myStruct> array2(size);

   std::transform(std::begin(input),
                  std::end(input),
                  array2.begin(),
                  [](int v) -> myStruct { return myStruct(v); });


   return(0);
}

Конструктор по умолчанию myStruct можно избежать с помощью std::copy и std::back_inserter.

#include <vector>
#include <algorithm>

struct myStruct
{
   int value;    

   myStruct(int input)
   { 
      value = input*input;
   }
};

int main()
{
   int input[5] = {1,2,3,4,5};  

   // Create an empty vector.
   std::vector<myStruct> array2;

   // Add items to the vector by using std::copy and std::back_inserter.
   std::copy(std::begin(input),
             std::end(input),
             std::back_inserter(array2));

   return(0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...