我可以创建一个数组并像这样初始化它:
int a[] = {10, 20, 30};
我如何创建一个std::vector和初始化它同样优雅?
我知道的最好的方法是:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
有没有更好的办法?
我可以创建一个数组并像这样初始化它:
int a[] = {10, 20, 30};
我如何创建一个std::vector和初始化它同样优雅?
我知道的最好的方法是:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
有没有更好的办法?
当前回答
如果你的编译器支持可变宏(这对大多数现代编译器都是正确的),那么你可以使用下面的宏把矢量初始化变成一行代码:
#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。
其他回答
我使用va_arg构建自己的解决方案。该解决方案是c++ 98兼容的。
#include <cstdarg>
#include <iostream>
#include <vector>
template <typename T>
std::vector<T> initVector (int len, ...)
{
std::vector<T> v;
va_list vl;
va_start(vl, len);
for (int i = 0; i < len; ++i)
v.push_back(va_arg(vl, T));
va_end(vl);
return v;
}
int main ()
{
std::vector<int> v = initVector<int> (7,702,422,631,834,892,104,772);
for (std::vector<int>::const_iterator it = v.begin() ; it != v.end(); ++it)
std::cout << *it << std::endl;
return 0;
}
Demo
你可以使用boost::assign:
vector<int> values;
values += 1,2,3,4,5,6,7,8,9;
详情在这里。
c++ 11:
static const int a[] = {10, 20, 30};
vector<int> vec (begin(a), end(a));
对于向量初始化-
vector<int> v = {10, 20, 30}
如果你有c++ 11编译器就可以做到。
否则,你可以有一个数据数组,然后使用for循环。
int array[] = {10,20,30}
for(unsigned int i=0; i<sizeof(array)/sizeof(array[0]); i++)
{
v.push_back(array[i]);
}
除此之外,在前面的回答中还描述了使用一些代码的各种其他方法。在我看来,这些方法容易记忆和快速书写。
在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))