C ++ 98在代码中有效使用“for_each”

时间:2014-11-13 14:06:44

标签: c++ foreach

我想直接进入代码;这是我的结构:

struct pnt {
  mesh::Point _point;
  pnt_type _type;
  bool _aux;
  };

enum NNSerach {A_NN = 0, B_NN, C_NN, ALL}; 

这是我的功能:

void typeDetection( pnt& PNT, const NNSerach NNType, const fieldclass& field )

这是我在字段类的成员函数中的for循环。

vector< pnt > oldpnTs;
...
  for(size_t iter = 0; iter < oldpnTs.size(); iter++ )
  {
    typeDetection(oldpnTs[iter], ALL, *this);
  }

当我的vector成员只是应用函数的一个参数时,是否可以在这里使用for_each?

编辑:我只能使用 C ++ 98 我想为oldpnTs向量的每个成员应用typeDetection函数。

3 个答案:

答案 0 :(得分:2)

你可以,虽然这不会让我说得更好,因为你需要为typeDetection定义一个仿函数,然后将其传递给{{ 1}}(不要忘记在创建时将for_eachthis值传递给仿函数,以便在需要时将它们传递给NNSearch

在这种情况下,我考虑保持for循环不变,因为代码在当前形式下是可读的,除非你必须在多个这样的向量上执行此操作不同的尺寸,导致以下结果:

typeDetection

而不是像你现在拥有的多个4个衬里循环。

答案 1 :(得分:1)

是的,这应该有用(虽然我无法测试它,因为这里没有真正定义)。而不是代码的这一部分,

   vector< pnt > oldpnTs;

   for(size_t iter = 0; iter < oldpnTs.size(); iter++ )
   {
     typeDetection(oldpnTs[iter], ALL, *this);
   }

你可以尝试这个(在C ++ 14中):

   vector< pnt > oldpnTs;
   NNSerach all = ALL;
   // ...
   std::for_each(oldpnTs.begin(), oldpnTs.end()
               , [this, all](auto& x) {this->typeDetection(x, all, *this);});



在C ++ 98中,

编辑,而不是lambda,你肯定可以使用一个仿函数来修复pnt&旁边的其他变量。或者您可以使用boost::lambdaboost::bind

答案 2 :(得分:0)

当您使用C ++ 98时,您应该使用仿函数自己实现lambda函数:

#include <vector>
#include <algorithm>

struct pnt {
  mesh::Point _point;
  pnt_type _type;
  bool _aux;
    };

enum NNSerach {A_NN = 0, B_NN, C_NN, ALL}; 

class fieldclass;

class TypeDetection
{
public:
    TypeDetection(const NNSerach NNType, const fieldclass& field) : _NNType(NNType), _field(field){}
    void operator() (pnt& PNT)
    {
        typeDetection(PNT, _NNType, _field);
    }
private:
    void typeDetection( pnt& PNT, const NNSerach NNType, const fieldclass& field ){}

    const fieldclass& _field;
    const NNSerach _NNType;
};

class fieldclass
{
public:
    void Do()
    {
        std::vector<pnt> oldpnTs;
        std::for_each(oldpnTs.begin(), oldpnTs.end(), TypeDetection(ALL, *this));
    }
};