Ich bin verwirrt über die Schnittstelle von std::find
. Warum braucht es kein Compare
Objekt, das ihm sagt, wie man zwei Objekte vergleicht?Wie std :: mit einem Compare-Objekt finden?
Wenn ich könnte ein Compare
Objekt übergeben ich den folgenden Code Arbeit machen könnte, wo ich von Wert vergleichen möchte, anstatt nur direkt die Zeigerwerte zu vergleichen:
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;
Ist die folgende der empfohlene Weg es zu tun?
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"
Danke! Aus Neugier, was ist falsch mit "copy_if"? – Frank
@dehmann: Das einzige, was daran falsch ist, ist, dass es nicht im Standard ist. Es wurde im Wesentlichen aufgrund eines Schnittunfalls ausgelassen. –