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

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

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

我知道的最好的方法是:

std::vector<int> ints;

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

有没有更好的办法?


当前回答

有各种方法来硬编码一个向量。我将分享一些方法:

通过逐个推入值来初始化 //创建一个空向量 向量< int > vect; vect.push_back (10); vect.push_back (20); vect.push_back (30); 初始化类似数组 Vector <int> Vector {10,20,30}; 从数组初始化 Int arr[] = {10,20,30}; Int n = sizeof(arr) / sizeof(arr[0]); Vector <int> Vector (arr, arr + n); 从另一个向量初始化 Vector <int> vect1{10,20,30}; Vector <int> Vector (Vector 1.begin(), Vector 1.end()));

其他回答

我倾向于宣称

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);

在编写测试时,创建一个内联的向量而不定义变量是非常方便的,例如:

assert(MyFunction() == std::vector<int>{1, 3, 4}); // <- this.

如果你的编译器支持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所说的那样做。

如果可以,使用现代c++[11,14,17,20,…]):

std::vector<int> ints = {10, 20, 30};

在变长数组上循环或使用sizeof()的旧方法真的很糟糕,而且在精神开销方面完全没有必要。讨厌的东西。

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

#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;
}