在向量中查找结构体

Min*_*ham 5 c++ vector

我想找到一个所有成员数据都与某些值匹配的结构。

我做了一个小程序如下:

#include <iostream>
#include <vector>
using namespace std;
struct vlan {
    int vlanId;
    bool status;
};

vector<vlan> vlanTable; 

int main(){
    vlan tmp;
    tmp.status = true;
    tmp.vlanId = 1;
    vector <vlan>::iterator flag = find(vlanTable.begin(), vlanTable.end(), tmp);
    if ( flag != vlanTable.end()){
        cout<<"found"<<endl;
    }
    else cout<<"not found"<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它返回错误为:模板参数推导/替换在查找函数处失败。

有人可以帮助我吗?

Adr*_*ica 7

==您需要为您的班级提供运算符vlan

struct vlan {
    int vlanId;
    bool status;
    bool operator==(const vlan& rhs) const {
        return (vlanId == rhs.vlanId) && (status == rhs.status);
    }
};
Run Code Online (Sandbox Code Playgroud)

另外,正如评论中所述,您应该#include <algorithm>(对于 的定义std::find);某些编译器可能会隐式包含其他标头中的此内容,但不要依赖于此。


请注意,根据aschepler的评论,如果您有一个符合 C++20(或更高版本)标准的编译器,您可以operator==为您的vlan类定义默认值:

struct vlan {
    int vlanId;
    bool status;
    bool operator==(const vlan& rhs) const = default; // C++20
};
Run Code Online (Sandbox Code Playgroud)

对于您的vlan结构,这将执行与上面定义的“显式”版本完全相同的比较。来自cppreference(或C++20 标准草案本身):

默认相等比较

类可以定义operator==为默认类,返回值为bool。这将按照声明顺序生成每个基类和成员子对象的相等比较。如果两个对象的基类和成员的值相等,则两个对象相等。如果在声明顺序中较早的成员或基类中发现不等式,则测试将短路。

  • @MinhPham 如果您不提供“==”运算符,则“std::find”算法不“知道”如何比较 2 个“vlan”对象。内置类型具有预定义的比较;您定义的类和结构没有这些。 (3认同)
  • 或者,如果使用 C++20 模式,您可以将上面的内容缩短为“bool operator==(const vlan&amp; rhs) const = default;”。(定义太空船运算符还将定义“operator!=”、“operator&lt;”、“operator&gt;”、“operator&lt;=”、“operator&gt;=”,您可能需要也可能不需要。) (3认同)
  • @AdrianMole 没问题。(所有 SE 问题、答案和评论都是 CC BY-SA 4.0,如果缺少归属,我很少会大惊小怪。) (2认同)

Hos*_*ein 5

在 C++ 中,结构体默认不生成比较运算符。您需要编写自己的:

struct vlan {
    int vlanId;
    bool status;

    bool operator==(const vlan& v) const
    {
        return vlanId == v.vlanId; // or another approach as above
    }
};
Run Code Online (Sandbox Code Playgroud)