Tôi đang bối rối về giao diện của std::find
. Tại sao nó không lấy một đối tượng Compare
cho biết cách so sánh hai đối tượng?Làm thế nào để std :: tìm kiếm bằng cách sử dụng một đối tượng So sánh?
Nếu tôi có thể vượt qua một đối tượng Compare
tôi có thể làm cho công việc mã sau đây, nơi tôi muốn so sánh theo giá trị, thay vì chỉ so sánh các giá trị con trỏ trực tiếp:
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;
là sau cách khuyến khích để làm điều đó?
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"
Cảm ơn! Trong tò mò, có gì sai với 'copy_if'? – Frank
@dehmann: Điều duy nhất sai với nó là nó không có trong tiêu chuẩn. Nó bị bỏ lại chủ yếu do một tai nạn chỉnh sửa. –