我有Holiday
班
class Holiday
{
public:
private:
string id;
string destinationCode;
string destinationName;
};
我正在尝试使用find方法查找Holiday
向量中的任何Holiday
对象是否包含属性:字符串ID等于H001
这就是我试过的
vector<Holiday>::iterator h1;
vector<Holiday>::iterator h2;
vector<Holiday>::iterator h3;
h1 = this->holidayPackages.begin();
h2 = this->holidayPackages.end();
h3=find(h1,h2,"H001");
我收到编译错误
错误C2678:二进制'==':找不到左侧的操作符 “假日”类型的操作数
如何使用find方法找到Holiday对象的属性?
编辑:我正在寻找NON C++11 answer
答案 0 :(得分:3)
find
模板需要定义operator==
。所以,试试这个:
bool Holiday::operator==(const string& other) const {
return id == other;
}
另外不要忘记在类中声明此运算符:
class Holiday
{
public:
bool operator==(const string& other) const;
private:
string id;
string destinationCode;
string destinationName;
};
答案 1 :(得分:2)
您无法使用std::find
搜索不同类型的项目列表,但您可以使用std::find_if
,如下所示:
h3 = find_if(h1, h2, [] (const Holiday& h) { return h.id == "H001"; } );
注意:上面使用lambda语法,这在C ++ 11之前是不可用的。如果你的编译器不兼容C ++ 11,那么你需要提供一个&#34; regular&#34;用于比较id
和目标值的函数。
答案 2 :(得分:2)
如果你没有operator ==而且没有使用C ++ 11:
#include <algorithm>
#include <iostream>
class Holiday
{
public:
const std::string& get_id() const { return id; }
private:
std::string id;
std::string destinationCode;
std::string destinationName;
};
int main()
{
std::vector<Holiday> holidays;
struct Predicate {
bool operator () (const Holiday& holiday) {
return holiday.get_id() == "H001";
}
};
std::find_if(holidays.begin(), holidays.end(), Predicate());
}
答案 3 :(得分:0)
您的迭代器适用于Holiday
个实例,但您在调用Holiday
时尝试将const char*
与find
进行比较。编译器如何知道它应该将字符串与id
而不是destinationCode
或destionationName
进行比较
如果您可以访问C ++ 11,则可以使用lambda:
auto it=std::find_if(h1, h2, [](const Holiday &h){return h.id=="H001";});
答案 4 :(得分:0)
find函数需要一个==运算符来检查向量中的某个东西是否等于第三个参数所以在你的类中定义一个==运算符,如下所示:
bool operator==(const string& other) const {
return id == other;
}