将具有两个参数的成员函数传递给C ++ STL算法stable_partition

时间:2015-10-27 17:43:25

标签: c++ stl stl-algorithm

我有以下成员函数

class foo 
{
    public:
        ...
        bool isNotEqualId(const Agent&, const int);
        std::vector<Agent> foo::extractAgents(int id);
    private:
        std::vector<Agent> agents;
}

功能定义如下:

bool foo::isNotEqualId(const Agent& agent, const int id)
{
    return (agent.groupId != id);
} 

现在,在foo中,我是给定代理ID的分区代理,以便稍后提取另一个参数。

std::vector<Agent>& foo::extractAgents(int id)
{
    std::vector<Agent>::iterator iter = std::stable_partition(agents.begin(), agents.end(), &foo::isNotEqualId(id));

    // Partition to find agents that need to be removed
    std::vector<Agent>::iterator extractedGroupiter = std::stable_partition(iter, agents.end(), keepAgent);
    // Create a vector with the agents that need to be removed
    std::vector<Agent> extractedGroup(extractedGroupiter, agents.end());
    // Erase them from the agents vector
        agents.erase(extractedGroupiter, agents.end());
        return extractedGroup;
}
当与具有固定组值的函数(例如

)一起使用时,

使用std::stable_partition

bool isNotGroup0(const Agent& a)
{
    return a.groupId != 0;
}

但是,现在我想使用一个带有两个参数的成员函数,因此组ID可以是一个参数。 stable_partition接受一个导致我这个问题的一元谓词。我已尝试将std::bind2ndstd::mem_fun一起使用,以便在将第二个参数传递给stable_partition时将其绑定,但会导致mem_fun没有实例的错误重载的功能。

我还尝试了here这样的仿函数解决方案,建议使用std::binary_function,但可以理解的是会导致错误term does not evaluate to a function taking 1 arguments。我正在使用VS2010。任何指针?

2 个答案:

答案 0 :(得分:2)

由于您使用的是Visual Studio 2010,并且我不知道该版本中是否有lambdas,请使用函数对象:

struct AgentFunctor
{
   int id_;
   AgentFunctor(int id) : id_(id) {}
   bool operator()(const Agent& agent) const
   { return agent.groupId != id_; }
};
//...
AgentFunctor af(id);
std::vector<Agent>::iterator iter = std::stable_partition(agents.begin(), agents.end(), af);

答案 1 :(得分:0)

您可以使用lambda

std::stable_partition(agents.begin(), agents.end(),
                      [nGroupID, foo](x){
                        return foo.isNotEqualID(x, nGroupID);});

刚刚注意到VS2010评论,我很确定没有lambda,在这种情况下你必须手动创建函数对象,例如在PaulMcKenzie的回答中。