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

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,你可以简单地这样做:

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所说的那样做。

其他回答

开始:

int a[] = {10, 20, 30}; //I'm assuming 'a' is just a placeholder

如果你没有c++ 11编译器,也不想使用Boost:

const int a[] = {10, 20, 30};
const std::vector<int> ints(a, a+sizeof(a)/sizeof(int)); //Make it const if you can

如果你没有c++ 11编译器,可以使用Boost:

#include <boost/assign.hpp>
const std::vector<int> ints = boost::assign::list_of(10)(20)(30);

如果你有c++ 11编译器:

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

在c++ 0x中,你可以用与数组相同的方式来做这件事,但不是在当前的标准中。

只有语言支持,您可以使用:

int tmp[] = { 10, 20, 30 };
std::vector<int> v( tmp, tmp+3 ); // use some utility to avoid hardcoding the size here

如果你可以添加其他库,你可以尝试boost::assignment:

vector<int> v = list_of(10)(20)(30);

要避免硬编码数组的大小:

// option 1, typesafe, not a compile time constant
template <typename T, std::size_t N>
inline std::size_t size_of_array( T (&)[N] ) {
   return N;
}
// option 2, not typesafe, compile time constant
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))

// option 3, typesafe, compile time constant
template <typename T, std::size_t N>
char (&sizeof_array( T(&)[N] ))[N];    // declared, undefined
#define ARRAY_SIZE(x) sizeof(sizeof_array(x))

如果你的编译器支持可变宏(这对大多数现代编译器都是正确的),那么你可以使用下面的宏把矢量初始化变成一行代码:

#define INIT_VECTOR(type, name, ...) \
static const type name##_a[] = __VA_ARGS__; \
vector<type> name(name##_a, name##_a + sizeof(name##_a) / sizeof(*name##_a))

使用这个宏,你可以用这样的代码定义一个初始化的向量:

INIT_VECTOR(int, my_vector, {1, 2, 3, 4});

这将创建一个名为my_vector的int型新向量,元素为1,2,3,4。

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

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

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