关于结构体的set::count()函数问题
时间:2011-12-24
来源:互联网
#include<iostream>
#include<set>
typedef struct State
{
int a[3][3];
bool operator < (const State &b) const
{
int i, j;
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
if((*this).a[i][j] >= b.a[i][j])
{
return false;
}
}
}
return true;
}
}State;
using namespace std;
int main()
{
set<State> ss;
State temp;
int i,j;
for(i = 0; i < 10; i++)
{
for(j = 0; j < 9; j++)
{
temp.a[j/3][j%3] = i;
}
ss.insert(temp);
}
for(i = 0; i < 10; i++)
{
for(j = 0; j < 9; j++)
{
temp.a[j/3][j%3] = j;
}
cout << ss.count(temp);
}
return 0;
}
结果是一排1,但是插入的结构体和传入count的结构体明显不一样,为什么结果还是1.
#include<set>
typedef struct State
{
int a[3][3];
bool operator < (const State &b) const
{
int i, j;
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
if((*this).a[i][j] >= b.a[i][j])
{
return false;
}
}
}
return true;
}
}State;
using namespace std;
int main()
{
set<State> ss;
State temp;
int i,j;
for(i = 0; i < 10; i++)
{
for(j = 0; j < 9; j++)
{
temp.a[j/3][j%3] = i;
}
ss.insert(temp);
}
for(i = 0; i < 10; i++)
{
for(j = 0; j < 9; j++)
{
temp.a[j/3][j%3] = j;
}
cout << ss.count(temp);
}
return 0;
}
结果是一排1,但是插入的结构体和传入count的结构体明显不一样,为什么结果还是1.
作者: TYplayIT 发布时间: 2011-12-24
结果是1,说明有元素啊
作者: agoago_2009 发布时间: 2011-12-24
但是那个元素不应该在set中啊
作者: TYplayIT 发布时间: 2011-12-24
应该是<的定义问题,set是通过a<b和b<a都不成立来判断a=b的,而你的代码里<号的定义使得两者的确都是false..
作者: streamlv 发布时间: 2011-12-24
3楼正解。
你随便拿一组数据对比即可。
ss里的
000
000
000
与tmp里的
012
345
678
比,
比[0][0]时,
即可造成2次比较都返回false,
即相等,
count即认为找到了。。。
你随便拿一组数据对比即可。
ss里的
000
000
000
与tmp里的
012
345
678
比,
比[0][0]时,
即可造成2次比较都返回false,
即相等,
count即认为找到了。。。
作者: mzlogin 发布时间: 2011-12-25
这里这种结果是正确的,两次循环得到的数只是顺序上不同,第一次你插入到set中后,第二次去set里面找自然找得到,输出结果当然是一排1,不奇怪
作者: qscool1987 发布时间: 2011-12-25
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28