我有这样的结构:
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));
其中v
是std::vector<SomeStruct>
。由于operator==
是针对两种类型(SomeStruct
和std::string
)定义的,它确实适用于我,但我想知道它是否正确或是否在函数的行为中这种情况取决于实现。在任何情况下,我想我应该使用std::find_if
自定义谓词(也许是lambda函数),对吗?
答案 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 [...]
因此该函数的预期行为是使用==
运算符。只要类型已经打开,那么该功能将起作用。如果您没有==
运算符,那么您需要使用带谓词的重载并在谓词中进行比较。