remove_if с boost :: bind медленный

У меня есть список классов 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));

Я не могу найти документацию о том, что создается и уничтожается. Поэтому мой простой вопрос: как мне сделать это более эффективным?

3

Решение

Попробуйте заменить звонок на 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 ) );
}
};
8

Другие решения

Вы можете решить свою проблему, используя простой функтор, который вы передаете 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());
}

Пример того, что компилирует здесь

0

По вопросам рекламы [email protected]