Можно ли использовать нечто вроде generate_n
для создания const vector
, например, случайных чисел? Я не мог придумать, как это сделать, не вызывая vector
и выполняя назначение в конструкторе.
Как бы вы инициализировали const-вектор результатов функции с использованием С++ 11?
Ответ 1
Используйте статический помощник или лямбда, если хотите; move semantics/copy elision, как указано в комментариях, сделает это довольно дешевым, поскольку все достойные компиляторы будут пропускать полную копию вектора, возвращаемого помощником. Вместо этого они просто создают код для заполнения одного вектора, а затем используют его.
std::vector< int > Helper()
{
const size_t n = 10;
std::vector< int > x( n );
std::generate_n( x.begin(), n, someGenerator );
return x;
}
const std::vector< int > my_const_vec( Helper() );
вот лямбда-версия:
const std::vector< int > my_const_vec( [] ()
{
const size_t n = 10;
std::vector< int > x( n );
std::generate_n( x.begin(), n, someGenerator );
return x;
}() );
Ответ 2
Инкапсулируйте свою инициализацию в функцию и объявите ее "constexpr", чтобы вы могли использовать ее для инициализации выражения const.
Ответ 3
Вы также можете использовать std::transform
vector<int> vec(10,1);
transform(vec.begin(), vec.end(), vec.begin(), func);
Где func:
int func(int i)
{
//return a random generated number
}