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使其有效,并感谢您的建议。如果您将其作为答案发布,我可以将其作为最佳答案,谢谢!