2010-10-05 3 views
6

Как я могу отменить возвращаемое значение предиката и удалить элементы, которые возвращают false вместо true?Обращение remove_if в remove_not_if

Вот мой код:

headerList.remove_if(FindName(name)); 

(не обращайте внимания на отсутствие стирания)

с FindName простой функтор:

struct FindName 
{ 
    CString m_NameToFind; 

    FindInspectionNames(const CString &nameToFind) 
    { 
     m_NameToFind = nameToFind; 
    } 

    bool operator()(const CHeader &header) 
    { 
     if(header.Name == m_NameToFind) 
     { 
      return true; 
     } 

     return false; 
    } 
}; 

Я хотел бы что-то вроде:

list.remove_if(FindName(name) == false); 

Не у et, используя C++ 0x, поэтому lambdas не допускается, к сожалению. Я надеюсь, что есть более приятное решение, чем создание функции NotFindName.

ответ

15

Проверить not1 в заголовке <functional>:

headerList.remove_if(std::not1(FindName(name))); 

Ой, а это:

if(header.Name == m_NameToFind) 
{ 
    return true; 
} 

return false; 

Пожалуйста не делают этого.

return (header.Name == m_NameToFind); 

Это гораздо лучше, не так ли?

+1

Спасибо, это работает со следующими модами: Functor нуждается наследовать от станд :: unary_function оператор() должна быть константная функция член – DanDan

+1

На самом деле наследование не является необходимым, но вам нужно чтобы определить правильный typedef, который он дает вам бесплатно. Что касается 'const' -ess, то это само собой разумеется :) –

0

К сожалению, я думаю, что создание функтора NotFindName - ваш лучший выбор.

3

в качестве альтернативы вы можете использовать повысить привязку, так что вам не нужно писать, что unary_function-структуру:

bool header_has_name (const CHeader& h, const CString& n) {return h.name == n;} 

headerList.remove_if (boost::bind (header_has_name, _1, "name")); 

и remove_if_not:

headerList.remove_if (!boost::bind (header_has_name, _1, "name")); 

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

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