【问题标题】:Find Object in Vector C++在向量 C++ 中查找对象
【发布时间】:2013-07-10 02:19:00
【问题描述】:

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

【问题讨论】:

  • 如果它只访问公共成员,它不应该是一个真正的朋友功能。使其成为非朋友免费功能,我会为这两个参数采用Category。如果用string 调用它,它将被转换。唯一可能会弄乱的是字符串文字(至少在我们得到 s 后缀之前)。
  • 将其从字符串更改为类别使其工作,并感谢您的建议。如果您将其发布为答案,我可以接受它作为最佳答案,谢谢!

标签: c++ vector stl


【解决方案1】:

您已将operator== 定义为获取Categorystd::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 的类型。这感觉像是毫无意义的额外工作,只会增加模棱两可的可能性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多