gpt4 book ai didi

C++: vector 容器和 std::find

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:27:18 24 4
gpt4 key购买 nike

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

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 == for std::tuple 可能节省你一些打字:

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

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

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

关于C++: vector 容器和 <algorithm> std::find,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15009823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com