Подтвердить что ты не робот

Как бы вы инициализировали const-вектор результатов функции с использованием С++ 11?

Можно ли использовать нечто вроде generate_n для создания const vector, например, случайных чисел? Я не мог придумать, как это сделать, не вызывая vector и выполняя назначение в конструкторе.

4b9b3361

Ответ 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 
}