半面妆 虎牢:关于STL map的问题

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/28 02:44:34
typedef struct TriKey
{
int k[3];

bool operator<(const TriKey rhs) const
{
// k[3]里最小数小于rhs的最小数
return ((k[0] < rhs.k[0] || k[1] < rhs.k[1] || k[2] < rhs.k[2]) &&
(k[0] < rhs.k[0] || k[1] < rhs.k[2] || k[2] < rhs.k[1]) &&
(k[0] < rhs.k[1] || k[1] < rhs.k[0] || k[2] < rhs.k[2]) &&
(k[0] < rhs.k[1] || k[1] < rhs.k[2] || k[2] < rhs.k[0]) &&
(k[0] < rhs.k[2] || k[1] < rhs.k[1] || k[2] < rhs.k[0]) &&
(k[0] < rhs.k[2] || k[1] < rhs.k[0] || k[2] < rhs.k[1])
);
}
} TRIKEY;

using namespace std;

typedef map<TRIKEY, int> MY_TYPE;
typedef map<TRIKEY, int>::iterator MY_ITER;

int main()
{
MY_TYPE nums;
TRIKEY key;
MY_ITER iter;

//////////////////////////////////////////////////////////////////////////
key.k[0] = 61; key.k[1] = 9; key.k[2] = 18; nums[key] = 1;
key.k[0] = 9; key.k[1] = 118; key.k[2] = 1; nums[key] = 2;
key.k[0] = 61; key.k[1] = 1; key.k[2] = 145; nums[key] = 3;
key.k[0] = 1; key.k[1] = 118; key.k[2] = 145; nums[key] = 4;
key.k[0] = 118; key.k[1] = 51; key.k[2] = 1; nums[key] = 5;
//////////////////////////////////////////////////////////////////////////

for (iter = nums.begin(); iter != nums.end(); iter++)
{
TRIKEY p = iter->first;

cout<<p.k[0]<<", "<<p.k[1]<<", "<<p.k[2]<<": "<<iter->second<<endl;
}

while (key.k[0]!=0)
{
cout<<"input key: ";
cin>>key.k[0]>>key.k[1]>>key.k[2];

iter = nums.find(key);
int s = iter->second;

if (iter != nums.end())
{
cout<<s<<endl;
}
else
{
cout<<"no result"<<endl;
}
}

return 0;
}

输入键值:(9, 118, 1) or (9, 1, 118) or (1, 118, 9) or (118, 1, 9)
输出结果:2

输入键值:(1, 118, 145)
输出结果:no result

除了91 118 145组成的键值不能找到相应的值外,其余四种组合都能找到相应的值,
是不是TRIKEY的operator<定义的有问题。

我的意图如下:
bool operator==(const TriKey rhs) const
{
return ((k[0] == rhs.k[0] && k[1] == rhs.k[1] && k[2] == rhs.k[2]) ||
(k[0] == rhs.k[0] && k[1] == rhs.k[2] && k[2] == rhs.k[1]) ||
(k[0] == rhs.k[1] && k[1] == rhs.k[0] && k[2] == rhs.k[2]) ||
(k[0] == rhs.k[1] && k[1] == rhs.k[2] && k[2] == rhs.k[0]) ||
(k[0] == rhs.k[2] && k[1] == rhs.k[1] && k[2] == rhs.k[0]) ||
(k[0] == rhs.k[2] && k[1] == rhs.k[0] && k[2] == rhs.k[1])
);
}

比如数组k1[3],k2[3],只要k1中的数字都能在k2中找到就算键值相等。
为什么会出现上面的结果呢?搞了好几个小时,没发现其中的奥秘,敬请指教!
纠错:“除了1 118 145组成的键值不能找到相应的值外,其余四种组合都能找到相应的值”