[英]Find Object in Vector C++
我一直在尝试找出在向量中找到对象的最佳方法。 目前,我正在尝试在此对象上使用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 ++ :(
您已经定义了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
然后是您的类),但是只能执行一次。 为了避免重载,一旦C ++ 14出现,最好的解决方案是利用新的文字后缀:
find(modes.begin(), modes.end(), "Name"s)
^std::string because of the s
现在,始终可以定义自己的_s
来执行相同的操作。 我个人更喜欢用户添加s
或_s
而不是再添加两个重载或重载构造函数以采用可从其构造std::string
类型。 感觉像是没有意义的额外工作,只会增加歧义的可能性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.