std::find与结构体运算符重载

anuosix 2009-09-20 10:18:13
结构体定义如下:
struct struTriad
{
tstring u;
tstring v;
int iNum;
bool operator<(struTriad & triad)
{
if (triad.u>u)
{
if (triad.v>v)
{
return true;
}
}
}
bool operator==(struTriad &triad)
{
if (u.compare(triad.u)==0)
{
return true;
}
}


}

然后在程序中有使用到了stl的算法
vector<struTriad> m_vtrUU;
m_VtrUU.push_back(...)
...

struTriad stru1;
stru1.u=_T("who");
stru1.v=_T("who");
stru1.iNum=2;
vector<struTriad>::iterator it=find(m_vtrUU.begin(),m_vtrUU.end(),stru1);

结果出错,错误信息如下:
error C2678: 二进制“==”: 没有找到接受“struTriad”类型的左操作数的运算符(或没有可接受的转换)

但是重载的的“<”确实没有出错
std::sort(m_vtrUU.begin(),m_vtrUU.end());
这个可以运行,
什么原因,如何改?
...全文
306 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
thy38 2009-09-20
  • 打赏
  • 举报
回复
我提两个解决方案吧:

方案一:在类中加入自己的判断函数,然后绑定:
#include <iostream>
#include <vector>
#include <string>
#include <functional>

using namespace std;

typedef string tstring; //FOR TEST

struct struTriad
{
tstring u;
tstring v;
int iNum;

bool equalU(const struTriad n) const {return n.u == u;}
};

int main()
{
vector <struTriad> m_vtrUU;
struTriad u;
vector <struTriad>::iterator it =
find_if(m_vtrUU.begin(),m_vtrUU.end(),
bind2nd(mem_fun_ref(&struTriad::equalU), u));
}



方案2:也就是LZ的方案,不过用binary_function更清楚,也避免了效率问题:
#include <iostream>
#include <vector>
#include <string>
#include <functional>

using namespace std;

typedef string tstring; //FOR TEST

struct struTriad
{
tstring u;
tstring v;
int iNum;
};

class strInStruVtr:public std::binary_function <struTriad, struTriad, bool>
{
public:
bool operator()(const struTriad& a, const struTriad& b) const {
return a.u==b.u;
}
};

int main()
{
vector <struTriad> m_vtrUU;
struTriad u;
vector <struTriad>::iterator it =
find_if(m_vtrUU.begin(),m_vtrUU.end(),
bind2nd(strInStruVtr(), u));
}


对了,楼主应该是在MFC里面搞的吧?
typedef string tstring; //FOR TEST
这一句是为了避免麻烦,LZ自行删除就行了
brookmill 2009-09-20
  • 打赏
  • 举报
回复
重载的<和==
只返回true,不返回false吗?
  • 打赏
  • 举报
回复
少了几个const
struct struTriad {
tstring u;
tstring v;
int iNum;
bool operator <( struTriad & triad )const{
if ( triad.u>u ) {
if ( triad.v>v ) {
return true;
}
}
}
bool operator==(const struTriad &triad )const {
if ( u.compare( triad.u )==0 ) {
return true;
}
};
};

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧