C++ 如何使用比较对象查找?
我对C++ 如何使用比较对象查找?,c++,stl,vector,find,compare,C++,Stl,Vector,Find,Compare,我对std::find的接口感到困惑。为什么不使用Compare对象来告诉它如何比较两个对象 如果我可以传递一个Compare对象,我就可以让下面的代码工作,在这里我想通过值进行比较,而不是直接比较指针值: typedef std::vector<std::string*> Vec; Vec vec; std::string* s1 = new std::string("foo"); std::string* s2 = new std::string("foo"); vec.push
std::find
的接口感到困惑。为什么不使用Compare
对象来告诉它如何比较两个对象
如果我可以传递一个Compare
对象,我就可以让下面的代码工作,在这里我想通过值进行比较,而不是直接比较指针值:
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;
typedef std::vector Vec;
Vec-Vec;
std::string*s1=新的std::string(“foo”);
std::string*s2=新的std::string(“foo”);
向量推回(s1);
Vec::const_iterator found=std::find(Vec.begin(),Vec.end(),s2);
//显然,没有找到,因为我不能告诉它通过值进行比较
删除s1;
删除s2;
以下是推荐的方法吗
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"
模板
结构MyEqualsByVal{
康斯特T&x;
MyEqualsByVal(常数T&x):x_ux{}
布尔运算符()(常数T&y)常数{
返回*x_u==*y;
}
};
// ...
向量推回(s1);
Vec::找到常量迭代器=
std::find_if(vec.begin(),vec.end(),
MyEqualsByVal(s2));//好的,我会找到“foo”
由于您的T
是一个指针,您也可以在函数对象中存储指针的副本
除此之外,它就是这样做的,没有太多的东西了
另外,将裸指针存储在容器中不是一个好主意,除非您非常小心地确保异常安全,这几乎总是比它的价值更麻烦。这正是
find\u(如果
用于)的目的-它需要一个被调用来比较元素的谓词。find
不能重载为一元谓词而不是值,因为它是一个无约束的模板参数。因此,如果调用find(first,last,my_predicate)
,那么无论是希望对范围的每个成员计算谓词,还是希望找到与谓词本身相等的范围成员,都可能存在歧义(它可以是一系列谓词,因为所有标准库的设计者都知道或关心它,或者迭代器的value\u type
可以转换为谓词类型,也可以转换为它的argument\u type
)。因此,find\u if
需要使用一个单独的名称
find
除了搜索的值之外,还可以重载以获取可选的二进制谓词。但是,正如您所做的那样,在函子中捕获值是一种标准技术,因此我认为这不会是一个巨大的收益:这当然是不必要的,因为您总是可以使用find\u if
如果你得到了你想要的find
,你仍然需要编写一个函子(或者使用boost),因为
不包含任何取消引用指针的内容。不过,作为二元谓词,你的函子会简单一点,或者你可以使用函数指针,所以这是一个适度的增益。所以我不知道为什么不提供它。鉴于复制\u if
的失败,我不确定假设总是有goo有多大价值d算法不可用的原因:-)和。。。我完全错过了问题的前半部分。。。哎呀。不过,史蒂夫·杰索普的答案比我解释的要好。@dehmann:唯一的问题是它不在标准中。它被漏掉了,主要是因为一次编辑事故。