+ -
当前位置:首页 → 问答吧 → 关于结构体的set::count()函数问题

关于结构体的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.

作者: 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即认为找到了。。。

作者: mzlogin   发布时间: 2011-12-25

这里这种结果是正确的,两次循环得到的数只是顺序上不同,第一次你插入到set中后,第二次去set里面找自然找得到,输出结果当然是一排1,不奇怪

作者: qscool1987   发布时间: 2011-12-25