免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 23238 | 回复: 9
打印 上一主题 下一主题

[C++] 如何实现两个Key的map(多KEY值MAP问题) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-08 16:24 |只看该作者 |倒序浏览
10可用积分
一个MAP,KEY是个多值结构(或类),想这样使用这个MAP:
两个Key中任意一个匹配就命中目标// map-key 定义
class CKey
{
public:
    int key1;  // 取值唯一
    long key2; // 取值唯一
    bool operator <(const CKey &ths) const
    {
        // 这里如何实现???
    }
};

// map-data 定义
class CData
{
public:
    int s;
    char m[10];
};

map<CKey, CData> testMap;

例如:
    CKey k;
    MapData sData;

    k.key1 = 10;
    k.key2 = 100;
    sData.s = 111;
    strcpy(sData.m,"111");
    testMap.insert(Val(k,sData));

    k.key1 = 11;
    k.key2 = 200;
    sData.s = 222;
    strcpy(sData.m,"222");
    testMap.insert(Val(k,sData));

    k.key1 = 12;
    k.key2 = 300;
    sData.s = 333;
    strcpy(sData.m,"333");
    testMap.insert(Val(k,sData));


指定一个KEY
    k.key1 = 10
    k.key2 = 任意
    则可以在testMap中命中一个目标

    k.key1 = 任意
    k.key2 = 200
    则可以在testMap中命中一个目标

还请STL-MAP达人指点......

论坛徽章:
0
2 [报告]
发表于 2008-05-08 16:52 |只看该作者
两个key存放的是同一个值.

论坛徽章:
0
3 [报告]
发表于 2008-05-08 17:18 |只看该作者
原帖由 converse 于 2008-5-8 16:52 发表
两个key存放的是同一个值.


???

论坛徽章:
0
4 [报告]
发表于 2008-05-08 17:21 |只看该作者
map模板第三个参数是一个仿函数, 自己定义一下。

论坛徽章:
0
5 [报告]
发表于 2008-05-08 17:27 |只看该作者
原帖由 okmmno1 于 2008-5-8 17:21 发表
map模板第三个参数是一个仿函数, 自己定义一下。


难道重载map的KEY的"<"符不行吗?
bool operator <(const CKey &ths) const
{
      // 这里如何实现???
}

关键是如何实现这个重载"<"?!

论坛徽章:
0
6 [报告]
发表于 2008-05-08 18:42 |只看该作者
使用两个map,分别对应于两个关键字,为了共享数据,可以考虑在容器中存放数据指针

对于你的代码,如果要填空的话,应该没法实现的,因为map要求键值可排序,而你有两个键值,是没法建立一种合理的有序序列的

论坛徽章:
0
7 [报告]
发表于 2008-05-08 18:47 |只看该作者
举个例子,对于三组键值:(3, 5), (5, 7), (7, 9)

按你的想法,那么
如果以(3, 5), (5, 7), (7, 9)的顺序存放数据,那么容器中有(3, 5), (7, 9)( (5, 7)与(3, 5)等价,舍去了)
如果以(5, 7), (3, 5), (7, 9)的顺序存放数据,那么容器中只有(5, 7)

论坛徽章:
0
8 [报告]
发表于 2008-05-08 20:14 |只看该作者
原帖由 tyc611 于 2008-5-8 18:47 发表
举个例子,对于三组键值:(3, 5), (5, 7), (7, 9)

按你的想法,那么
如果以(3, 5), (5, 7), (7, 9)的顺序存放数据,那么容器中有(3, 5), (7, 9)( (5, 7)与(3, 5)等价,舍去了)
如果以(5, 7), (3, 5), (7 ...


明白你的意思,但需要说明的是:
key1和key2的值是没有可能相等的,也就是说不会出现(3,5) (5,7) (7,9)这样的情况,因为可以这样理解,比如:
      key1的长度是6位的,即如:100001...100099
      key2的长度是8位的,即如:10000001...10000099

还望赐教...

论坛徽章:
0
9 [报告]
发表于 2008-05-08 23:15 |只看该作者
原帖由 chinaljj 于 2008-5-8 20:14 发表


明白你的意思,但需要说明的是:
key1和key2的值是没有可能相等的,也就是说不会出现(3,5) (5,7) (7,9)这样的情况,因为可以这样理解,比如:
      key1的长度是6位的,即如:100001...100099
      ke ...

我只是举个例子说明没法对两个键值建立一种有序关系而已(见6楼),即使key1和key2没有可能相等,但问题仍然存在
因为对于a.key1 < b.key1 && a.key2 > b.key2的情形,你不能定义谁大谁小

解决方法还是请参考6楼的建议

论坛徽章:
0
10 [报告]
发表于 2010-06-02 07:18 |只看该作者
权威实现,可使用C++ Boost库中MultiIndex;如果要简单的
参考我写的一个对std::map的简单再封装。

//两个关键字的影射表容器
// 两个键值类型不能相同
//两个关键字决定内部必然是两个影射表

//使用一个关键字查询对象和标准模板库中的map复杂度一样
//插入和删除操作相当于标准模板库中的map操作进行了两次,但内部只有一份值的拷贝
//目的:如果你有一个结构或类的数组容器,既需要按照类中一个变量A来查询,又要按照了类中另一个变量B来查询;

twokeysmap.rar

2.54 KB, 下载次数: 255

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP