0

我一直在试图找出在向量中找到对象的最佳方法。目前我正在尝试在这个对象上使用 find :

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;
  }

};

这是我的发现:

vector<Category>::iterator category = find(modes.begin(), modes.end(), Category("Name"));

当我尝试编译时出现错误说“没有找到运算符,它为“==”采用“类别”类型的左侧操作数我查看了算法标题并找到了查找代码:

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);
}

我不确定从这里去哪里。任何建议将不胜感激,我不太了解 C++ :(

4

1 回答 1

0

您已定义operator==采用 aCategory和 a ,std::string但您试图找到未定义的 a 。在这种情况下,您可以只传递字符串文字:Categoryoperator==

find(modes.begin(), modes.end(), "Name")

但是,我建议将相等运算符更改为另一个Category. 比较相同类型的两个对象是合乎逻辑的,并且当字符串位于左侧而没有额外重载时,这种方式有效,因为您的类型可以从std::string. 我还建议不要让它成为朋友,因为它只访问公共成员之外的任何东西:

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

目前,始终可以定义自己的_s功能。我个人更喜欢用户添加s或添加_s两个重载或重载构造函数以获取std::string可构造的类型。这感觉像是毫无意义的额外工作,只会增加模棱两可的可能性。

于 2013-07-11T17:38:14.593 回答