Как проще всего инициализировать std :: vector жестко закодированными элементами?

564
задан Prateek Gupta 4 March 2019 в 14:16
поделиться

5 ответов

Одним из методов может быть использование массива для инициализации вектора

static const int arr[] = {16,2,77,29};
vector<int> vec (arr, arr + sizeof(arr) / sizeof(arr[0]) );
529
ответ дан 22 November 2019 в 22:09
поделиться

Если ваш компилятор поддерживает 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 под капотом), поэтому для кода, критичного к производительности, лучше поступить так, как говорит Якоби.

605
ответ дан 22 November 2019 в 22:09
поделиться

В 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))
76
ответ дан 22 November 2019 в 22:09
поделиться

Если вам нужно что-то общего порядка с 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);
4
ответ дан 22 November 2019 в 22:09
поделиться

вы можете сделать это с помощью boost::assign.

vector<int> values;  
values += 1,2,3,4,5,6,7,8,9;

подробности здесь

10
ответ дан 22 November 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: