1

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

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’

更新:

感谢大家的快速帮助和明确的答案!

4

2 回答 2

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(参数依赖查找)将失败,并且您可能会收到编译器错误。

如果您正在使用 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::tie和重载operator ==的 forstd::tuple可能会为您节省一些输入:

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

然后可以在比较值v1v2类型时以这种方式使用上面的 lambda var

return (tieMembers(v1) == tieMembers(v2));
于 2013-02-21T18:38:27.623 回答
2

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

bool operator==(const var& a, const var& b){
  return (a.name == b.name) && (a.value == b.value);
}
于 2013-02-21T18:39:48.450 回答