正确使用std ::找到这种方式

时间:2015-08-11 15:59:18

标签: c++ c++11

我有这样的结构:

struct SomeStruct{
/* ...various members */
std::string some_data;
bool operator==(const std::string& s) { return s==some_data; }
};

在某些时候,我在可迭代容器(即std::find)上使用std::vector函数,如下所示:

auto it = std::find(v.begin(), v.end(), std::string(some_string));

其中vstd::vector<SomeStruct>。由于operator==是针对两种类型(SomeStructstd::string)定义的,它确实适用于我,但我想知道它是否正确或是否在函数的行为中这种情况取决于实现。在任何情况下,我想我应该使用std::find_if自定义谓词(也许是lambda函数),对吗?

2 个答案:

答案 0 :(得分:4)

这是正确的行为。但是,除非您确实希望SomeStruct在所有其他上下文中与std::string保持公平,否则使用==实现启用std::find可能不是最佳解决方案。

更好的方法是使用find_if和lambda:

auto it = std::find_if(v.begin(), v.end(), [&] (const SomeStruct& s) {
    return s.some_data==some_string;
});

这样,字符串与SomeStruct的比较是显式的,并且其范围受限于some_data查找。

答案 1 :(得分:0)

来自C ++ 11标准25.2.5

  

返回:以下相应条件所适用的[first,last]范围内的第一个迭代器i:* i == value [...]

因此该函数的预期行为是使用==运算符。只要类型已经打开,那么该功能将起作用。如果您没有==运算符,那么您需要使用带谓词的重载并在谓词中进行比较。