2015-10-27 1 views
0

У меня есть функции-членов следующейПередача функции члена с двумя параметрами для C++ алгоритма STL stable_partition

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

Теперь в обув, я разбиение на разделы агентов с учетом идентификатора агента, чтобы впоследствии извлечь их с другим параметром.

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; 
} 

Однако, теперь я хочу использовать функцию-член, которая принимает два параметра, так Идентификатор группы может быть параметром. stable_partition принимает унарный предикат, который вызывает у меня проблему. Я попытался использовать std::bind2nd с std::mem_fun, чтобы связать второй параметр при передаче его stable_partition, но он приводит к ошибкам с mem_fun, не имеющим экземпляра перегруженной функции.

Я также попробовал решение-функтор, такое как here, которое предлагает использовать std::binary_function, однако он, понятно, приводит к ошибке term does not evaluate to a function taking 1 arguments. Я использую VS2010. Любые указатели?

+0

Другой вопрос: почему вы пишете имя класса в этой строке std :: vector foo :: extractAgents (int id); –

+0

'bool foo :: isNotEqualId (const Agent &, const int id)' отсутствует идентификатор, вероятно агент. Это опечатка? Какая у вас ошибка ? –

+0

Да, это опечатка, только что обновленная – ccoder83

ответ

2

Поскольку вы используете Visual Studio 2010, и я не знаю, если лямбды доступны в этой версии, используйте функцию объекта:

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); 
+0

Да, вы правы, у нее нет лямбда, и спасибо за кучу, это сработало! – ccoder83

0

Вы можете просто использовать lambda:

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

Только что заметил комментарий VS2010, который, я уверен, не имеет lambdas, и в этом случае вам нужно создать объект функции более вручную, например, в ответе PaulMcKenzie.

Смежные вопросы