我可以创建一个数组并像这样初始化它:

int a[] = {10, 20, 30};

我如何创建一个std::vector和初始化它同样优雅?

我知道的最好的方法是:

std::vector<int> ints;

ints.push_back(10);
ints.push_back(20);
ints.push_back(30);

有没有更好的办法?


当前回答

在C++ 11之前:

方法1

vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));

方法2

vector<int>v;
v.push_back(SomeValue);

下面的c++ 11也是可能的

vector<int>v = {1, 3, 5, 7};

我们也可以这样做

vector<int>v {1, 3, 5, 7}; // Notice .. no "=" sign

对于c++ 17以后,我们可以省略类型

vector v = {1, 3, 5, 7};

其他回答

如果你不想使用Boost,但想享受语法

std::vector<int> v;
v+=1,2,3,4,5;

只需要包含这段代码

template <class T> class vector_inserter{
public:
    std::vector<T>& v;
    vector_inserter(std::vector<T>& v):v(v){}
    vector_inserter& operator,(const T& val){v.push_back(val);return *this;}
};
template <class T> vector_inserter<T> operator+=(std::vector<T>& v,const T& x){
    return vector_inserter<T>(v),x;
}

我倾向于宣称

template< typename T, size_t N >
std::vector<T> makeVector( const T (&data)[N] )
{
    return std::vector<T>(data, data+N);
}

在一个实用程序头的某处,然后所需要的是:

const double values[] = { 2.0, 1.0, 42.0, -7 };
std::vector<double> array = makeVector(values);

c++ 11:

static const int a[] = {10, 20, 30};
vector<int> vec (begin(a), end(a));

在C++ 11之前:

方法1

vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));

方法2

vector<int>v;
v.push_back(SomeValue);

下面的c++ 11也是可能的

vector<int>v = {1, 3, 5, 7};

我们也可以这样做

vector<int>v {1, 3, 5, 7}; // Notice .. no "=" sign

对于c++ 17以后,我们可以省略类型

vector v = {1, 3, 5, 7};

相关的,如果你想在一个快速语句中完全准备好一个向量(例如,立即传递给另一个函数),你可以使用以下方法:

#define VECTOR(first,...) \
   ([](){ \
   static const decltype(first) arr[] = { first,__VA_ARGS__ }; \
   std::vector<decltype(first)> ret(arr, arr + sizeof(arr) / sizeof(*arr)); \
   return ret;})()

例子函数

template<typename T>
void test(std::vector<T>& values)
{
    for(T value : values)
        std::cout<<value<<std::endl;
}

示例使用

test(VECTOR(1.2f,2,3,4,5,6));

尽管要小心decltype,但要确保第一个值显然是你想要的。