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

时间:2013-02-21 18:37:10

标签: c++ vector stl iterator

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

struct var{
  string name;
  int value;
};

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

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;
    }
}

只是为了确定,我得到的错误是调用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’

更新

谢谢你们所有的快速帮助,以及明确的答案!

2 个答案:

答案 0 :(得分: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);
}

确保在与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);
    });

正如GManNickG正确指出的那样,当您需要比较多个成员时,使用std::tieoperator ==重载std::tuple可能会为您节省一些输入内容:

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

在比较v1类型的值v2var时,可以使用上述lambda:

return (tieMembers(v1) == tieMembers(v2));

答案 1 :(得分:2)

您需要为operator==定义var的重载。这应该有用。

bool operator==(const var& a, const var& b){
  return (a.name == b.name) && (a.value == b.value);
}