Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用比较对象查找?_C++_Stl_Vector_Find_Compare - Fatal编程技术网

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:唯一的问题是它不在标准中。它被漏掉了,主要是因为一次编辑事故。