C++:向量容器和<algorithm> std :: find

nax*_*nge 1 c++ iterator stl vector

我创建了一个包含变量信息的结构,即它们的名称和编号

struct var{
  string name;
  int value;
};
Run Code Online (Sandbox Code Playgroud)

现在,我想使用迭代器来更新它,使用以下函数:

void updateVariable(vector<Variable>& vars,Variable& newVar){
    vector<Variable>::iterator it = find(vars.begin(), vars.end(), newVar);

    if(it == vars.end()){
        vars.push_back(newVar);
    }
    else{
        *it = newVar;
    }
}
Run Code Online (Sandbox Code Playgroud)

只是为了确定,我得到的错误是调用find()的行.任何想法为什么我收到错误?这是错误:

/usr/include/c++/4.6/bits/stl_algo.h:162:4: error: no match for ‘operator==’ in ‘__first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Variable*, _Container = std::vector<Variable>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference = Variable&]() == __val’
Run Code Online (Sandbox Code Playgroud)

更新:

谢谢大家的快速帮助,以及明确的答案!

And*_*owl 7

您尚未operator ==var结构定义.find()默认情况下,该算法将用于operator ==比较您提供的值和指定范围内的值,并将迭代器返回到比较相等的第一个元素.

要解决这个问题,请operator ==为您的班级重载.一种方法是:

struct var
{
    string name;
    int value;
};

bool operator == (var const& v1, var const& v2)
{
    return (v1.name == v2.name) && (v1.value == v2.value);
}
Run Code Online (Sandbox Code Playgroud)

确保operator ==在与var结构相同的命名空间中定义,否则ADL(Argument Dependent Lookup)将失败,您可能会遇到编译器错误.

如果您正在使用C++ 11并且您不想打扰定义重载版本operator ==,您甚至可以使用find_if()并传递lambda作为最后一个参数:

find_if(vars.begin(), vars.end(), [&] (var const& v) { 
    return (v.name == newVar.name) && (v.value == newVar.value);
    });
Run Code Online (Sandbox Code Playgroud)

正如GManNickG正确指出的那样,当你需要比较几个成员时,使用std::tie和重载operator ==for std::tuple可以节省一些输入:

 auto const tieMembers = [] (const var&) { 
    return std::tie(v.name, v.value, ...);
    };
Run Code Online (Sandbox Code Playgroud)

在比较值v1v2类型时,可以使用上述lambda var:

return (tieMembers(v1) == tieMembers(v2));
Run Code Online (Sandbox Code Playgroud)