C ++, как инициализировать член вектора из списка значений - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь инициализировать переменную-член вектора массивом целых чисел:

#include <vector>
#include <iostream>

struct A
{
    A(int arr[]) : mvec(arr)
    { }
    std::vector<int> mvec;
};

int main()
{
    A s({1,2,3});
}

Компиляция выдает ошибку:

$ c++ -std=c++11 try59.cpp

try59.cpp:15:12: note: candidates are:
try59.cpp:6:1: note: A::A(int*)
 A(int arr[]) : mvec(arr)

Как я могу инициализировать мой вектор, используя массив целых чисел?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Если по какой-то причине вы действительно хотите инициализировать вектор, используя массив в стиле C, а не std::initializer_list, вы можете сделать это, используя дополнительный уровень косвенности:

struct A {
    template<std::size_t n>
    A(const int (&arr)[n]) :
        A(arr, std::make_index_sequence<n>{})
    { }

    template<std::size_t... is>
    A(const int (&arr)[sizeof...(is)], std::index_sequence<is...>) :
        mvec{arr[is]...}
    { }

    std::vector<int> mvec;
};

A a({1, 2, 3});

Редактировать. Как указано в комментарии Франсуа Андрие , std::vector можно инициализировать с помощью пары итераторов, поэтому конструктор упрощается до:

template<std::size_t n>
A(const int (&arr)[n]) : mvec(arr, arr + n)
{ }

Но если вы инициализировали, например, std::array вместо std::vector, трюк index_sequence кажется неизбежным.

0 голосов
/ 14 ноября 2018

Я бы просто использовал std::initializer_list, поскольку это то, что вы уже передаете

A(std::initializer_list<int> arr) : mvec(arr)
{

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