我一直试图找出在向量中找到对象的最佳方法。目前我正在尝试对此对象使用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"));
当我尝试编译说“没有找到操作符,其中包含左侧操作数类型”类别“for”=“时,我收到错误”我查看了算法标题并找到了查找代码:
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 ++ :(
答案 0 :(得分:0)
您已定义operator==
以Category
和std::string
,但您正试图找到Category
,operator==
不是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
一起使用它将按照您的方式使用,但如果传递字符串文字则不行。这是因为它必须经过两次用户定义的转换才能到达您的班级(find(modes.begin(), modes.end(), "Name"s)
^std::string because of the s
然后您的班级),但只能执行一次。保持重载,一旦C ++ 14出现,最好的解决方案是使用新的文字后缀:
_s
现在,始终可以定义自己的s
来做同样的事情。我个人更喜欢用户添加_s
或std::string
来添加两个重载或重载构造函数以获取{{1}}可构造的类型。这感觉就像毫无意义的额外工作,只会增加模棱两可的可能性。