Как использовать лямбду повышения для заполнения вектора указателей с новыми объектами

Я недавно начал использовать лямбду повышения и думал, что попытался бы использовать ее в местах, где это/должно, делают вещи легче читать.

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

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() );

Который аккуратно убирается.

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

Я попробовал..

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

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

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

Спасибо Mark.

5
задан ScaryAardvark 11 January 2010 в 16:20
поделиться

4 ответа

Вероятно, нет специальной магии MVC, которая делает это возможным.

Уверен:

if( HttpContext.Current.Request.Path == "some some menu url" )

или

if( ViewContext_Or_ControllerContext.RouteData.Values["controller"] == "some value") 

используется где-то.

Этот код можно разместить примерно в трех различных местоположениях (View (.aspx), ViewModel, Custom StartHelper), и для всех них потребуется один и тот же бит кода.

-121--3181300-

Это пример создания гистограммы (или таблицы частот в других словах), в которой можно ознакомиться с подробностями обработки изображения.

Но моя главная рекомендация - не использовать RGB (если веб-сайт, на который вы смотрите, не имеет в основном простых цветов), а использовать HSB вместо этого. Компонент «H» (оттенок) даст вам лучшую индикацию используемых цветов независимо от того, насколько они яркие или темные.

-121--3279282-

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

#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:: вектор с динамически выделенными указателями в исключительном безопасном способе не так просто.

9
ответ дан 18 December 2019 в 14:46
поделиться

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

0
ответ дан 18 December 2019 в 14:46
поделиться

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

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

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

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

0
ответ дан 18 December 2019 в 14:46
поделиться

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

static const int PtrVectorSize = 20;

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

также, вы можете использовать BOOST :: PTR_VECTOR и сохранить себя удалением.

4
ответ дан 18 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

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