Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

Как инициализировать массив `std::array` с помощью `std::initializer_list`?

#cpp #массивы #cpp11


Как инициализировать массив std::array с помощью std::initializer_list?
    


Ответы

Ответ 1



Стандартный класс std::array является агрегатом. Из стандарта C++ (23.3.2 Class template array) 2 An array is an aggregate... Поэтому его нельзя инициализировать с помощью объекта std::initializer_list. Вы можете лишь копировать значения из объекта типа std::initializer_list в объекты класса std::array. Ниже показан пример, как это можно сделать Ниже показано, как это можно сделать для члена данных класса. #include #include #include #include #include int main() { struct A { A(std::initializer_list lst) { std::copy(lst.begin(), std::next(lst.begin(), std::min(lst.size(), a.size())), a.begin()); } std::array a; } obj{ 1, 2, 3, 4, 5 }; for (int x : obj.a) std::cout << x << ' '; std::cout << std::endl; } Так как число инициализаторов для объекта std::array может оказаться меньше, чем элементов в объекте, то, чтобы соответствовать нормам стандарта C++, оставшиеся без инициализаторов элементы так же желательно инициализировать. Для скалярных фундаментальных типов это инициализация 0. Поэтому будет более правильно будет записать конструктор класса следующим образом A(std::initializer_list lst) { auto it = std::copy(lst.begin(), std::next(lst.begin(), std::min(lst.size(), a.size())), a.begin()); std::fill(it, a.end(), 0); } добавив вызов алгоритма std::fill

Ответ 2



Честно говоря, не совсем понятна цель ... Можно же потом заполнить. Если всеж хочется одним оператором, можно лямбдой воспользоваться: #include #include int main() { std::initializer_list Init = {1,2,3,4,5,6}; // вариант 1 std::array Array1; std::copy(Init.begin(),Init.end(),Array1.begin()); // вариант 2 std::array Array2 = [&]() { std::array Values = { 0 }; std::copy(Init.begin(),Init.end(),Values.begin()); return Values; }(); for(const auto &i:Array1) std::cout << i << " "; std::cout << std::endl; for(const auto &i:Array2) std::cout << i << " "; std::cout << std::endl; return 0; } На ideone.

Ответ 3



Исключительно ради хохмы. Чтобы инициализировать std::array с помощью std::initializer_list нужно чтобы std::array содержал std::initializer_list: #include #include int main() { std::array, 2> a = { { { 1, 2, 3 }, { 4, 5, 6 } } }; for( auto e : a ) { for( auto i: e ) { std::cout << i << " "; } std::cout << "\n"; } } Тест

Комментариев нет:

Отправить комментарий