Oprócz Lambda i odręcznym funktora używanego przez Juancho, masz możliwość korzystania boost::bind
(C++ 03) lub std::bind
(C++ 11) i prostą funkcją:
bool isNameOfObj(const std::string& s, const Type& obj)
{ return obj.getName() == s; }
//...
std::vector<Type>::iterator it = find_if(v.begin(), v.end(),
boost::bind(&isNameOfObj, myString, boost::placeholders::_1));
lub jeśli Type
ma metodę isName
:
std::vector<Type>::iterator it = find_if(v.begin(), v.end(),
boost::bind(&Type::isName, boost::placeholders::_1, myString));
To jest tylko dla kompletności. W C++ 11 wolałbym Lambdas, w C++ 03 używałbym bind tylko wtedy, gdy sama funkcja porównania już istnieje. Jeśli nie, wolę funktora.
PS: Ponieważ C++ 11 nie ma polimorficznych/szablonowych lambd, bind nadal ma swoje miejsce w C++ 11, np. jeśli typy parametrów są nieznane, trudne do przeliterowania lub w inny sposób niełatwe do dedukcji.
Czy może być więcej niż jeden obiekt o tej samej nazwie? Czy chcesz je wszystkie znaleźć? –