在Vector C ++中查找对象

时间:2013-07-11 17:23:34

标签: c++ vector stl

我一直试图找出在向量中找到对象的最佳方法。目前我正在尝试对此对象使用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 ++ :(

1 个答案:

答案 0 :(得分:0)

您已定义operator==Categorystd::string,但您正试图找到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一起使用它将按照您的方式使用,但如果传递字符串文字则不行。这是因为它必须经过两次用户定义的转换才能到达您的班级(find(modes.begin(), modes.end(), "Name"s) ^std::string because of the s 然后您的班级),但只能执行一次。保持重载,一旦C ++ 14出现,最好的解决方案是使用新的文字后缀:

_s

现在,始终可以定义自己的s来做同样的事情。我个人更喜欢用户添加_sstd::string来添加两个重载或重载构造函数以获取{{1}}可构造的类型。这感觉就像毫无意义的额外工作,只会增加模棱两可的可能性。