У меня есть список классов std :: и я хочу удалить записи, помеченные для удаления. Я использую std :: remove_if и стереть.
class MyClass
{
bool isDone(MyData& myData)
{
return myData.isDone();
}
void removeIfDone(std::list<MyData>& myList)
{
std::list<MyData>::iterator it =
remove_if(myList.begin(), myList.end(),
boost::bind(&MyClass::isDone, this, _1));
myList.erase(it, myList.end());
}
};
Я работаю на небольшом процессоре, для которого выделение и освобождение памяти очень дорого. Это удаление вызывает новый и удалить тысячи раз в моем приложении.
Я ранее использовал boost::ref
при передаче нетривиальной переменной в качестве параметра связывания, но в этом случае я думаю, что, вероятно, проблема заключается в создании и уничтожении самого функтора или его копировании.
Я хотел бы сделать что-то вроде
boost::bind(&MyClass::isDone, boost::ref(this), boost::ref(_1));
Я не могу найти документацию о том, что создается и уничтожается. Поэтому мой простой вопрос: как мне сделать это более эффективным?
Попробуйте заменить звонок на std::remove_if
с std::list::remove_if
. Последний должен копировать только некоторые указатели из предыдущих и последующих элементов, вместо того, чтобы пытаться переместить элементы в конец списка, что является причиной множественных выделений, которые вы видите. Дополнительным преимуществом является то, что, поскольку он является функцией-членом std::list
фактически удаляет (то есть стирает) элементы, соответствующие вашему критерию.
class MyClass
{
bool isDone(MyData& myData)
{
return myData.isDone();
}
void removeIfDone(std::list<MyData>& myList)
{
myList.remove_if( boost::bind( &MyClass::isDone, this, _1 ) );
}
};
Вы можете решить свою проблему, используя простой функтор, который вы передаете std::remove_if
, Таким образом, вам не нужно передавать аргументы в remove_if
и сохранить себя boost::bind
struct functor
{
public:
bool operator()(MyData& mydata)
{
return mydata.IsDone();
}
};
void removeIfDone(std::list<MyData>& myList)
{
std::list<MyData>::iterator it =
remove_if(myList.begin(), myList.end(),
functor()); //call operator() on functor
myList.erase(it, myList.end());
}
Пример того, что компилирует здесь