Одним из методов может быть использование массива для инициализации вектора
static const int arr[] = {16,2,77,29};
vector<int> vec (arr, arr + sizeof(arr) / sizeof(arr[0]) );
Если ваш компилятор поддерживает 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);
Или:
#include <boost/assign/std/vector.hpp>
using namespace boost::assign;
...
std::vector<int> v;
v += 1, 2, 3, 4;
Но имейте в виду, что это имеет некоторые накладные расходы (в основном, list_of
создает std :: deque
под капотом), поэтому для кода, критичного к производительности, лучше поступить так, как говорит Якоби.
В 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))
Если вам нужно что-то общего порядка с Boost::assign без создания зависимости от Boost, следующее, по крайней мере, смутно похоже:
template<class T>
class make_vector {
std::vector<T> data;
public:
make_vector(T const &val) {
data.push_back(val);
}
make_vector<T> &operator,(T const &t) {
data.push_back(t);
return *this;
}
operator std::vector<T>() { return data; }
};
template<class T>
make_vector<T> makeVect(T const &t) {
return make_vector<T>(t);
}
Хотя я хотел бы, чтобы синтаксис для его использования был чище, он все же не особенно ужасен:
std::vector<int> x = (makeVect(1), 2, 3, 4);
вы можете сделать это с помощью boost::assign.
vector<int> values;
values += 1,2,3,4,5,6,7,8,9;