Синтаксис предиката при разбиении вектора указателей (C ++) - PullRequest
2 голосов
/ 28 октября 2009

У меня есть вектор указателей на объекты. Я хотел бы удалить объекты из этого вектора в соответствии с атрибутом, сообщаемым функцией-членом.

Я пытаюсь следовать хорошему примеру, который нашел, как удалить определенные указатели (и связанные с ними объекты) из вектора. Основная идея - разделить вектор, удалить выбранные объекты, а затем удалить указатели на эти объекты. Ниже приведен пример (из Доктор Доббс ):

vector<Object *> v ;

v.push_back( new Object( ... ) ) ;
...
vector<Object *>::iterator last =
partition( v.begin(), v.end(), not1(predicate()) ) ;
for( vector<Object *>::iterator i = last ; i != v.end() ; ++i )
{
  delete *i ;
}
v.erase( last, v.end() ) ;

Я озадачен правильным синтаксисом для предиката. Мои объекты принадлежат классу Strain, а мой вектор - вектор liveStrains. Предикатом должна быть функция-член Strain isExtinct (). Следующее не работает:

 vector< Strain * >::iterator last = partition( liveStrains.begin(), liveStrains.end(), not1(std::mem_fun_ref(&Strain::isExtinct)) );

Я вижу, что я пытаюсь вызвать функцию-член по указателю на объект, а не на сам объект. Чтобы обойти это, попытался изменить & на * (я, очевидно, новичок) и попытался создать функцию-член для класса Simulation, которая выполняет обновление liveStrains в функции-члене. Я не уверен, что стоит вдаваться в детали того, что не сработало. Я сильно смущен доступными синтаксическими опциями, или если то, что я пытаюсь сделать, даже разрешено.

Заранее спасибо за любую помощь.

1 Ответ

1 голос
/ 28 октября 2009

Решение состоит в том, чтобы использовать std :: mem_fun , который предназначен для указателей на объекты, а не std :: mem_fun_ref.

...