C++:向量容器和<algorithm>标准::查找
C++: vector containers and <algorithm> std::find
我创建了一个包含变量信息的结构,即变量的名称和编号
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
:类型的值v1
和v2
时,可以这样使用上述λ
return (tieMembers(v1) == tieMembers(v2));
您需要为var
定义operator==
的重载。这应该行得通。
bool operator==(const var& a, const var& b){
return (a.name == b.name) && (a.value == b.value);
}
相关文章:
- EASTL矢量<向量<int>>连续的
- C++ <algorithm> 使用对象作为比较定义的 sort()
- TicTacToe with MiniMax algorithm 4x4
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- is_permutation方法从 #include<algorithm> 显示错误的输出
- 设置::查找和查找之间的性能差异<algorithm>
- Stringholics algorithm
- Next_Permutation algorithm
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 我不使用<algorithm>标题,但 sort() 可用
- std::max在包含<algorithm>后无法解析
- C 字符串比较“祝您好运”&gt;“再见”
- <algorithm> 定义宏 X 吗?
- 在 C++ <algorithm>中查找函数
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 我可以打电话给<algorithm>空旷的设施吗?
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- C 操作员&gt;&gt;与突变器过载
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 是否需要使用 - &gt;运算符在C 中调用成员函数时