如何使用boost lambda来填充带有新对象的指针向量

Sca*_*ark 5 c++ lambda containers boost stl

我最近开始使用boost lambda并且认为我会尝试在可以/易于阅读的地方使用它.

我有一些类似于以下的代码

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

然后,删除它...

std::for_each( v.begin(), v.end(), boost::lamda::delete_ptr() );
Run Code Online (Sandbox Code Playgroud)

整齐整理.

然而,我以为我会在"lambda-ising"中使用lambda进行矢量填充...那就是烟花开始......

我试过了..

std::generate_n( v.begin(), 20, _1 = new X() );
Run Code Online (Sandbox Code Playgroud)

但这引发了各种编译器错误.

任何想法都是实现这一目标的最佳"lambda"方式.

谢谢马克.

Joe*_*oeG 9

这是一个代码片段,可以满足您的需求:

#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() );
}
Run Code Online (Sandbox Code Playgroud)

您可能想要考虑使用boost :: ptr_vector,因为使用带有动态分配指针的std :: vector以异常安全的方式并不容易.