C++ 在向量C+中查找对象+;

C++ 在向量C+中查找对象+;,c++,vector,stl,C++,Vector,Stl,我一直在试图找出在向量中找到物体的最佳方法。当前我正在尝试对此对象使用“查找”: class Category { public: string modeType; vector<VideoMode> videoModes; Category(){} Category(string name) { modeType = name; } friend bool operator== ( const Category &c1, con

我一直在试图找出在向量中找到物体的最佳方法。当前我正在尝试对此对象使用“查找”:

class Category
{
public:
  string modeType;
  vector<VideoMode> videoModes;

  Category(){}

  Category(string name) 
  {
     modeType = name;
  }

  friend bool operator== ( const Category &c1, const string &c2 )
  {
     return c1.modeType == c2;
  }

};
类别
{
公众:
字符串模式类型;
矢量视频模式;
类别(){}
类别(字符串名称)
{
modeType=名称;
}
友元布尔运算符==(常量类别和c1、常量字符串和c2)
{
返回c1.modeType==c2;
}
};
这是我的发现:

vector<Category>::iterator category = find(modes.begin(), modes.end(), Category("Name"));
vector::iterator category=find(modes.begin()、modes.end()、category(“Name”);
当我试图编译时遇到一个错误,说“找不到任何运算符,该运算符为“==”使用类型为“Category”的左手操作数。我查看了算法头并找到了查找代码:

template<class _InIt,
class _Ty> inline
_InIt _Find(_InIt _First, _InIt _Last, const _Ty& _Val)
{   // find first matching _Val
for (; _First != _Last; ++_First)
    if (*_First == _Val)
        break;
return (_First);
}
模板内联
_初始查找(_InIt_First,_InIt_Last,const_Ty&_Val)
{//查找第一个匹配值
对于(;_First!=_Last;++_First)
如果(*\u First==\u Val)
打破
返回(_优先);
}

我不太确定从哪里出发。任何建议都会被欣赏,我不太清楚C++。(

您已经定义了
操作符==
来获取
类别和
标准::字符串,但是您试图找到一个
类别,而
操作符==
没有定义。在这种情况下,您可以传递字符串文本:

find(modes.begin(), modes.end(), "Name")
但是,我建议将相等运算符更改为另一个
类别
。比较相同类型的两个对象是合乎逻辑的,这种方法在字符串位于左侧且没有额外重载时有效,因为您的类型可以从
std::string
隐式转换。我还建议不要将其作为朋友,因为它是doesn只能访问公共成员:

bool operator==(const Category &lhs, const Category &rhs) {
    return lhs.modeType == rhs.modeType;
}
将其与
std::find
一起使用将按照您的方式工作,但如果您传递字符串文字,则不会。这是因为它必须经过两个用户定义的转换才能到达您的类(
std::string
然后是您的类),但只能执行一个。将重载保持在较低水平,C++14出现后最好的解决方案是使用新的文字后缀:

find(modes.begin(), modes.end(), "Name"s)
                                 ^std::string because of the s

现在,你总是可以定义自己的
\u s
来做同样的事情。我个人更喜欢用户添加一个
s
\u s
,而不是再加两个重载或重载构造函数来获取可从中构造的
std::string
类型。这感觉像是毫无意义的额外工作,只会增加e歧义的可能性。

如果它只访问公共成员,那么它不应该是一个真正的朋友函数。将它设为一个非朋友自由函数,我将对这两个参数使用
类别
。如果用
字符串调用它,它将被转换。唯一可能会弄乱的是字符串文本(至少在我们得到s后缀之前)。将其从string改为Category使其有效,并感谢您的建议。如果您将其作为答案发布,我可以将其作为最佳答案,谢谢!