Как использовать boost lambda для заполнения вектора указателей новыми объектами - PullRequest
5 голосов
/ 11 января 2010

Я недавно начал использовать boost lambda и подумал, что попробую использовать его там, где это будет / должно облегчить чтение.

У меня есть код, подобный следующему

std::vector< X * > v;
for ( int i = 0 ; i < 20 ; ++i )
    v.push_back( new X() );

и позже, чтобы удалить его ...

std::for_each( v.begin(), v.end(), boost::lamda::delete_ptr() );

Что аккуратно убирает.

Тем не менее, я думал, что мне нужно "лямбда-зинг" для заполнения вектора с помощью лямбды ... Вот тогда начался фейерверк ...

Я пытался ..

std::generate_n( v.begin(), 20, _1 = new X() );

но это породило всевозможные ошибки компилятора.

Любые идеи, которые являются лучшим "лямбда" способом для достижения этого.

Thx Mark.

Ответы [ 4 ]

9 голосов
/ 11 января 2010

Вот фрагмент кода, который делает то, что вы хотите:

#include <algorithm>
#include <vector>

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/construct.hpp>

typedef int X;

int main() {
  std::vector<X*> v;
  std::generate_n( std::back_inserter(v), 20, boost::lambda::new_ptr<X>() );
  std::for_each( v.begin(), v.end(), boost::lambda::delete_ptr() );
}

Возможно, вы захотите рассмотреть возможность использования boost :: ptr_vector, поскольку использование std :: vector с динамически размещаемыми указателями безопасным способом не просто.

4 голосов
/ 11 января 2010

Вы можете рассмотреть:

static const int PtrVectorSize = 20;

// ....
v.resize(PtrVectorSize);
generate_n(v.begin(), PtrVectorSize, new_ptr<X>());

Кроме того, вы можете использовать boost :: ptr_vector и сохранять свои удаления.

0 голосов
/ 11 января 2010

Хорошо, после дополнительной игры я придумал это ...

std::generate_n( std::back_insert_iterator< std::vector< X* > >( ip ), 20, new_ptr< X >() ) );

Я не совсем уверен, что это так элегантно. С точки зрения программирования, это может быть, но с точки зрения «через 6 месяцев я буду знать, что это было предназначено», я не уверен ...

Не стесняйтесь указывать лучшие способы сделать это.

0 голосов
/ 11 января 2010

Не могу помочь с лямбдой, но вы смотрели на boost :: assign library?

...