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

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

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

我知道的最好的方法是:

std::vector<int> ints;

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

有没有更好的办法?


当前回答

如果你不想使用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;
}

其他回答

你可以使用boost::assign:

vector<int> values;
values += 1,2,3,4,5,6,7,8,9;

详情在这里。

如果你的编译器支持c++ 11,你可以简单地这样做:

std::vector<int> v = {1, 2, 3, 4};

这在GCC 4.4版中可用。不幸的是,vc++ 2010在这方面似乎落后了。

或者是Boost。Assign库使用非宏魔术来允许以下:

#include <boost/assign/list_of.hpp>
...
std::vector<int> v = boost::assign::list_of(1)(2)(3)(4);

Or:

#include <boost/assign/std/vector.hpp>
using namespace boost::assign;
...
std::vector<int> v;
v += 1, 2, 3, 4;

但请记住,这有一些开销(基本上,list_of在底层构造了一个std::deque),因此对于性能关键的代码,您最好按照Yacoby所说的那样做。

一种方法是使用数组初始化vector

static const int arr[] = {16,2,77,29};
vector<int> vec (arr, arr + sizeof(arr) / sizeof(arr[0]) );

如果你想把它放在你自己的课上:

#include <initializer_list>
Vector<Type>::Vector(std::initializer_list<Type> init_list) : _size(init_list.size()),
_capacity(_size),
_data(new Type[_size])
{
    int idx = 0;
    for (auto it = init_list.begin(); it != init_list.end(); ++it)
        _data[idx++] = *it;
}

c++ 11:

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