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)
更新:
谢谢大家的快速帮助,以及明确的答案!
您尚未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)
在比较值v1和v2类型时,可以使用上述lambda var:
return (tieMembers(v1) == tieMembers(v2));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1072 次 |
| 最近记录: |