键为指针时,std :: map查找失败

时间:2018-07-19 19:04:49

标签: c++11 stdmap

我无法找到std :: map来在std :: map中找到正确的行。关键是一个类指针,我创建了一个结构(tdEcApplDataMapEq)来比较该类的二进制数组是否匹配。'

问题是它不起作用。查找开始时,我调用FoEcApplData :: operator ==。它说第一个条目不匹配,然后查找返回指向std :: map列表上的第一项。查找未尝试搜索其他地图条目。同样,一次比赛测试失败(错误),那么为什么发现说它是比赛?

这可能与std :: map声明有关。 std :: map说第三个参数是std :: less的,但是我正在做== vs. <。 如果我将其更改为<相同,则会发生这种情况。它输入FoEcApplData :: operator <,它在第一次检查时返回true,然后查找停止,搜索指向列表中的第一个条目。

如何获取find()以使用自定义结构进行搜索?

我的示例向FdTEcApplDataMap添加了10行。它将CDH_DISABLE_XACT182类复制到保留状态以供以后搜索。然后,我使用hold作为搜索键进行find()测试。

Inside entry1
Inside entry2
Inside entry3<== this is the one I am searching for
Inside entry4
Inside entry5
Inside entry6
Inside entry7
Inside entry8
Inside entry9
Inside entry10
Inside entry1

这是发现:

    auto hazard = ExcludedCmdDict.find(&hold);
    if(hazard != ExcludedCmdDict.end())
    {
std::cout << "found it " << hazard->second << std::endl;
    }

这是正在使用的比较功能:

bool FoEcApplData::operator==( const FoEcApplData& FoEcApplDataObject) const {

    if(myNumOfBytes <= FoEcApplDataObject.NumOfBytes()) 
    { 
        const EcTOctet* temp; 
        temp = FoEcApplDataObject.Data() ; 

        for(EcTInt i = 0; i < myNumOfBytes ; i++)
        { 
            if(myData[i] != temp[i])
            { 
                return false ; 
            } 
        } 
        return true;
    } 
    else        // myNumOfBytes > FoEcApplDataObject.NumOfBytes()
    {
        const EcTOctet* temp; 
        temp = FoEcApplDataObject.Data() ; 

        for(EcTInt i = 0; i < FoEcApplDataObject.NumOfBytes(); i++)
        {
            if(myData[i] != temp[i])
            { 
                return false ; 
            } 
        } 
        return true;
    }
}

这是std :: map的声明。

/*
Custom less for find on the FdTEcApplDataMap.
Needed since we are using pointers.

Returns - true - match, false - no match

node  - pointer to the item you are looking for
node2 - pointer to an item on the list
*/

struct tdEcApplDataMapEq {
    bool operator()(FoEcApplData *const& node, FoEcApplData *const& node2) const
    {
        return *node == *node2;
    }
};
typedef std::map< FoEcApplData *, std::string, tdEcApplDataMapEq> FdTEcApplDataMap;

1 个答案:

答案 0 :(得分:0)

std::map希望比较功能像std::less一样工作。您需要使用以下方式:

struct tdEcApplDataMapEq {
    bool operator()(FoEcApplData *const& node, FoEcApplData *const& node2) const
    {
        return (*node < *node2); // Implement operator<() function for FoEcApplData 
    }
};

与此同时,更改struct的名称以反映其试图计算“小于”的事实。

struct tdEcApplDataMapLess {
    bool operator()(FoEcApplData *const& node, FoEcApplData *const& node2) const
    {
        return (*node < *node2); // Implement operator<() function for FoEcApplData 
    }
};