[英]c++ customized map key/value not in order
我使用自定义结构构建了以下映射。
#include <iostream>
#include <vector>
#include <map>
struct keys {
int first;
int second;
int third;
};
struct keyCompare
{
bool operator()(const keys& k1, const keys& k2)
{
//return (k1.first<k2.first && k1.second<k2.second && k1.third<k2.third);
return (k1.first<k2.first || k1.second<k2.second || k1.third<k2.third);
//return (k1.first<k2.first || (k1.first==k2.first && k1.second<k2.second) || (k1.first==k2.first
// && k1.second==k2.second && k1.third<k2.third));
}
};
int main()
{
keys mk, mk1;
int len = 4;
//int myints1[9] = {1,2,3,4,5,6, 7,8,9};
int myints1[12] = {1,2,3,4,5,6,1,2,3,1,2,3};
std::vector<int> input1(myints1, myints1+12);
std::map<keys, int, keyCompare> c2int;
for (int i = 0; i < len; i++) {
mk.first = input1[i*3];
mk.second = input1[i*3+1];
mk.third = input1[i*3+2];
c2int[mk] = i;
}
for (int i = 0; i < len;i++) {
mk1.first = input1[i*3];
mk1.second = input1[i*3+1];
mk1.third = input1[i*3+2];
std::cout << "map content " << c2int[mk1] << "\n";
}
return 0;}
该代码可以像{1,2,3,4,5,6,7,8,9}这样的非重复键正常工作。 回报是
map content is 0
map content is 1
map content is 2
但是当存在重复的模式时,例如,键为{1,2,3,4,5,6,1,2,3}。 打印出来的是
map content is 2
map content is 1
map content is 2
当我期待着
map content is 0
map content is 1
map content is 0
因为键{1,2,3}已经分配了值0。但是比较函数似乎将此键修改为值2而不是0。我尝试了不同的比较函数,但是没有一个显示预期的输出。 我想我错过了这种方法的一些东西。 有人可以解释吗? 谢谢
该比较器不正确:
bool operator()(const keys& k1, const keys& k2)
{
return (k1.first<k2.first || k1.second<k2.second || k1.third<k2.third);
}
考虑{1,4,9}
与{2,3,4}
。 {1,4,9} < {2,3,4}
是因为第一个比较,然后是{2,3,4} < {1,4,9}
是因为第二个比较! 显然那不是您想要的! 此外, operator<
必须不对称才能成为StrictWeakOrdering ,这是std::map
所必需的。
您必须按顺序处理密钥:
bool operator()(const keys& k1, const keys& k2) {
if (k1.first != k2.first) {
return k1.first < k2.first;
}
else if (k1.second != k2.second) {
return k1.second < k2.second;
}
else {
return k1.third < k2.third;
}
}
您的keyCompare
不适用于std::map
。
如果a
应该在b
之前订购,则需要为(a,b)
返回true
。
您编写了一个函数,该函数可以为(a,b)
和 (b,a)
返回true。 这违反了严格的弱排序 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.