binary ==:找不到带左手操作数的运算符;向量;迭代器

时间:2016-01-10 17:45:27

标签: c++ vector iterator

我学习向量,现在我遇到了问题: binary ==:找不到哪个运算符采用类型'对象'的左手操作数。 我发现在删除之后没有任何故事:

vector<Object>::iterator it = find(list.begin(), list.end(), name);

而且我不知道该怎么做。 也许你会问这样的事情

class Object {
private:
    string* name;
    vector<string>* facts;
public:
//...
}
    class ListOfObjects {
private:
    vector<Object> list;
public:
    void Realise(string* knowledge);
};

void ListOfObjects::Realise(string* knowledge) {
    //...
    vector<Object>::iterator it = find(list.begin(), list.end(), name);
    //...
}

2 个答案:

答案 0 :(得分:1)

问题在于std::find利用operator==检查您正在搜索的元素是否存在于当前选择中。

由于您传递了string*,因此在编译std::find模板方法时搜索的方法是

bool Object::operator==(string* argument) const

必须实现,其实现类似于

bool Object::operator==(string* argument) const
{
  return *argument == name;
}

但我发现这个解决方案存在潜在问题:

  • 您正在通过特定字段搜索集合中的元素,如果这是您使用的主要方式,那么另一个不同的集合会更好,例如std::unordered_map<string, vector<string>>,这将使一切变得更容易
  • 您可以使用与您为运算符重载的类型不同的类型的参数重载operator==,虽然这有效并且可以使用它在相同性方面没有多大意义你正在比较两种不同的类型
  • 您正在使用的string*大部分时间都没有意义(如果您想避免复制,请通过const std::string&

答案 1 :(得分:0)

我认为如果你想以这种方式比较对象,你会想要的是运算符重载。 这是一个简短的例子:

http://www.learncpp.com/cpp-tutorial/94-overloading-the-comparison-operators/

记下operator==的使用方式