Як найпростіше ініціалізувати std::вектор з жорстко заданими елементами?

Я можу створити масив і ініціалізувати його ось так:

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 v = {1, 2, 3, 4};

Це доступно у GCC починаючи з версії 4.4. На жаль, VC++ 2010, здається, відстає у цьому відношенні.

В якості альтернативи, бібліотека Boost.Assign використовує не-макромагію, щоб дозволити наступне:

#include 
...
std::vector v = boost::assign::list_of(1)(2)(3)(4);

Або:

#include 
using namespace boost::assign;
...
std::vector v;
v += 1, 2, 3, 4;

Але майте на увазі, що це пов'язано з деякими накладними витратами (по суті, list_of створює std::deque під капотом), тому для критично важливого до продуктивності коду вам краще зробити так, як каже Yacoby.

Коментарі (3)
Рішення

Одним з методів може бути використання масиву для ініціалізації вектора

static const int arr[] = {16,2,77,29};
vector vec (arr, arr + sizeof(arr) / sizeof(arr[0]) );
Коментарі (11)

У C++0x ви зможете зробити це так само, як і з масивом, але не в поточному стандарті.

За допомогою лише мовної підтримки, якою ви можете користуватись:

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

Якщо ви можете додати інші бібліотеки, ви можете спробувати boost::assignment:

vector v = list_of(10)(20)(30);

Щоб уникнути жорсткого кодування розміру масиву:

// option 1, typesafe, not a compile time constant
template 
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 
char (&sizeof_array( T(&)[N] ))[N];    // declared, undefined
#define ARRAY_SIZE(x) sizeof(sizeof_array(x))
Коментарі (9)