繁体   English   中英

在Vector C ++中查找对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM