我创建了一个包含变量信息的结构,即它们的名称和编号
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’
更新
谢谢你们所有的快速帮助,以及明确的答案!
答案 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::tie
和operator ==
重载std::tuple
可能会为您节省一些输入内容:
auto const tieMembers = [] (const var&) {
return std::tie(v.name, v.value, ...);
};
在比较v1
类型的值v2
和var
时,可以使用上述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);
}