C ++如何从值列表初始化向量成员

时间:2018-11-14 13:12:19

标签: c++ c++11

我正在尝试使用整数数组初始化向量成员变量:

#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 :(得分:5)

我只用std::initializer_list,因为那是您已经通过的

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

}

答案 1 :(得分:4)

如果出于某种原因您真的想使用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});

编辑。正如FrançoisAndrieux 在评论中指出的那样,std::vector可以使用一对迭代器进行初始化,因此构造函数可以简化为:

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

但是,如果您要初始化,例如std::array而不是std::vector,则index_sequence的trick俩似乎是不可避免的。