免费注册 查看新帖 |

Chinaunix

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

[C++] map多key查找问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-12 10:01 |只看该作者 |倒序浏览
1  一个map,两个key值,初始状态下两个key都有值。
2  查找时,如果想查找key1,则给一个key1值,map中有key1与该值匹配即为找到;如果想找key2,则给一个key2值,map中有key2与该值匹配即为找到。
3  key1与key2取值没有交集。

示例代码如下:
typedef struct tagUKey
{
    char a[10];
    char b[20];

    bool operator <(const struct tagUKey&ths) const
    {
        // 这里如何实现???
/*
该实现在 key.a = "11"时,输出找不到,其他都行,有问题。
        return (((strcmp(a,ths.a)<0)||((strcmp(a,ths.a)>0)&& (strcmp(b,ths.b)<0)))&& (strcmp(b,ths.b)<0));
*/
    }

} UKey;

map<UKey, int> gDat;
typedef map<UKey, int>::iterator      Dat_It;
typedef map<UKey, int>::value_type Dat_Val;

void init()
{
    UKey s;
    strcpy(s.a,"11");
    strcpy(s.b,"4111");
    gDat.insert(Dat_Val(s,1));

    strcpy(s.a,"22");
    strcpy(s.b,"4222");
    gDat.insert(Dat_Val(s,2));

    strcpy(s.a,"33");
    strcpy(s.b,"4333");
    gDat.insert(Dat_Val(s,3));
}

int main(int argc, char **argv)
{
    init();

    UKey s;
    strcpy(s.a,"22");

    Dat_It tmpIt;
    tmpIt = gDat.find(s);
    if (tmpIt != gDat.end())
    {
         printf("find. dat=%d\n",tmpIt->second);
    }
    else
        printf("not find.\n");

    UKey t;
    strcpy(t.b,"4333");
    tmpIt = gDat.find(s);
    if (tmpIt != gDat.end())
    {
         printf("find. dat=%d\n",tmpIt->second);
    }
    else
        printf("not find.\n");

    return 0;
}

请教各位达人能否这样?如果可以这样,那key结构体中的重载<如何实现?
不胜感谢!

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2009-10-12 10:17 |只看该作者
为啥不用multimap?

论坛徽章:
0
3 [报告]
发表于 2009-10-12 10:38 |只看该作者
原帖由 hellioncu 于 2009-10-12 10:17 发表
为啥不用multimap?


key没有重复,用map就可以了..

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2009-10-12 10:49 |只看该作者
越看越糊涂,不懂你的需求

论坛徽章:
0
5 [报告]
发表于 2009-10-12 11:07 |只看该作者
原帖由 hellioncu 于 2009-10-12 10:49 发表
越看越糊涂,不懂你的需求


举例来说:
有一个map,其内容为:
map=
{
    {("11","411"),1}
    {("22","422"),2}
    {("33","433"),3}
}

其中"()"中为key。假定两位字符串为key1,3位字符串为key2。

输入一个值,比如"11",并说明该值为key1的取值,则在map中可查找到1。
输入一个值,比如"411",并说明该值为key2的取值,则在map中同样可以查造到1。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2009-10-12 11:15 |只看该作者
你的UKey中没有约定何时按a找,何时按b找

论坛徽章:
0
7 [报告]
发表于 2009-10-12 11:16 |只看该作者
发下完整的测试代码吧,大伙看的清楚:

#include <iostream>
#include <string>
#include <map>

using namespace std;

//========================================================
typedef struct tagUKey
{
    char a[10];
    char b[20];

    bool operator <(const struct tagUKey&ths) const
    {
        // 这里如何实现???
        return (((strcmp(a,ths.a)<0)||((strcmp(a,ths.a)>0)&& (strcmp(b,ths.b)<0)))&& (strcmp(b,ths.b)<0));
    }

} UKey;

map<UKey, int> gDat;
typedef map<UKey, int>::iterator      Dat_It;
typedef map<UKey, int>::value_type Dat_Val;

//========================================================
// 初始化map
void init()
{
    UKey s;
    strcpy(s.a,"11");
    strcpy(s.b,"4111");
    gDat.insert(Dat_Val(s,1));

    strcpy(s.a,"22");
    strcpy(s.b,"4222");
    gDat.insert(Dat_Val(s,2));

    strcpy(s.a,"33");
    strcpy(s.b,"4333");
    gDat.insert(Dat_Val(s,3));

    strcpy(s.a,"44");
    strcpy(s.b,"4444");
    gDat.insert(Dat_Val(s,4));

    strcpy(s.a,"55");
    strcpy(s.b,"4555");
    gDat.insert(Dat_Val(s,5));
}

//========================================================
// 根据key值查找
void findKey(int nFlag,char *pInfo)
{
    UKey s;
    switch(nFlag)
    {
    case 0:
        strcpy(s.a,pInfo);
        break;
    case 1:
        strcpy(s.b,pInfo);
        break;
    }

    Dat_It tmpIt;
    tmpIt = gDat.find(s);
    if (tmpIt != gDat.end())
         printf("find. dat=%d\n",tmpIt->second);
    else
        printf("not find.\n");

}

//========================================================
int main(int argc, char **argv)
{
    init();

    findKey(0,"11");
    findKey(1,"4111");
    findKey(0,"22");
    findKey(1,"4555");

    return 0;
}

/*-------------------------------------------------------------
输出为:

not find.         // 这里很奇怪,没找到。如何实现重载<,才好?
find. dat=1
find. dat=2
find. dat=5

-------------------------------------------------------------*/

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
8 [报告]
发表于 2009-10-12 11:42 |只看该作者
你这种做法是实现不了的,插入和查找时key比较的方法不一致。
由于你说a,b的取值没有重复,一个可行的做法是:
map=
{
    {("11","411"),1}
    {("22","422"),2}
    {("33","433"),3}
}
--》

map=
{
    {("11"),1}
    {("411"),1}
    {("22"),2}
    {("422"),2}
    {("33"),3}
    {("433"),3}
}

论坛徽章:
0
9 [报告]
发表于 2009-10-12 15:39 |只看该作者
原帖由 hellioncu 于 2009-10-12 11:42 发表
你这种做法是实现不了的,插入和查找时key比较的方法不一致。
由于你说a,b的取值没有重复,一个可行的做法是:
map=
{
    {("11","411"),1}
    {("22","422"),2}
    {("33","433"),3}
}
--》

m ...


我也认为似乎没法实现,但如上所实现的对<号的重载,除了第一个key1无法找到外,我测试其他都可以实现我的所求。不知道什么原因。
感谢hellioncu的大力、无私支持,并又给我提供了一种解决思路...

十分感谢!
祝工作愉快!

论坛徽章:
0
10 [报告]
发表于 2009-10-12 22:17 |只看该作者
原帖由 chinaljj 于 2009-10-12 11:07 发表


举例来说:
有一个map,其内容为:
map=
{
    {("11","411") , 1}
    {("22","422") , 2}
    {("33","433") , 3}
}

其中"()"中为key。假定两位字符串为key1,3位字符串为key2。

输入一个值,比如 ...


如果:
map=
{
    {("11","411") , 1}
    {("11","422") , 2}
    {("33","433") , 3}
}
那么:用key1=11查找,岂不是找到1和2,有点map和multimap混用的意思!:mrgreen:

[ 本帖最后由 zpp71 于 2009-10-12 22:20 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP