Estoy confundido acerca de la interfaz de std::find
. ¿Por qué no toma un objeto Compare
que le dice cómo comparar dos objetos?¿Cómo se std :: encontrar utilizando un objeto Compare?
Si pudiera pasar un objeto Compare
que podría hacer el siguiente código de trabajo, donde me gustaría comparar por valor, en lugar de sólo la comparación de los valores del puntero directamente:
typedef std::vector<std::string*> Vec;
Vec vec;
std::string* s1 = new std::string("foo");
std::string* s2 = new std::string("foo");
vec.push_back(s1);
Vec::const_iterator found = std::find(vec.begin(), vec.end(), s2);
// not found, obviously, because I can't tell it to compare by value
delete s1;
delete s2;
¿La siguiente la forma recomendada ¿para hacerlo?
template<class T>
struct MyEqualsByVal {
const T& x_;
MyEqualsByVal(const T& x) : x_(x) {}
bool operator()(const T& y) const {
return *x_ == *y;
}
};
// ...
vec.push_back(s1);
Vec::const_iterator found =
std::find_if(vec.begin(), vec.end(),
MyEqualsByVal<std::string*>(s2)); // OK, will find "foo"
Gracias! Por curiosidad, ¿qué pasa con 'copy_if'? – Frank
@dehmann: Lo único malo es que no está en el estándar. Se excluyó esencialmente debido a un accidente de edición. –