C++:向量容器和<algorithm>标准::查找

C++: vector containers and <algorithm> std::find

本文关键字:algorithm gt 标准 查找 向量 lt C++      更新时间:2023-10-16

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

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’

更新:

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

您尚未为var结构定义operator ==。默认情况下,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);
}

请确保在与var结构相同的命名空间中定义operator ==,否则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 ==来代替std::tuple可能会为你节省一些键入:

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

当比较var:类型的值v1v2时,可以这样使用上述λ

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

您需要为var定义operator==的重载。这应该行得通。

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