我想直接进入代码;这是我的结构:
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函数。
答案 0 :(得分:2)
你可以,虽然这不会让我说得更好,因为你需要为typeDetection
定义一个仿函数,然后将其传递给{{ 1}}(不要忘记在创建时将for_each
和this
值传递给仿函数,以便在需要时将它们传递给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);});
编辑,而不是lambda,你肯定可以使用一个仿函数来修复pnt&
旁边的其他变量。或者您可以使用boost::lambda
或boost::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));
}
};