为什么map :: find找不到它的东西?

时间:2014-06-10 11:21:41

标签: c++ map find

我已经定义了这些结构

typedef struct SApair
{
    SApair();
    SApair(State state, Action action);

    State state;
    Action action;

    bool operator<( const SApair& n) const
    { 
        return (this->state.m_avgDpsXHealthEnemyGroup < n.state.m_avgDpsXHealthEnemyGroup
                && this->state.m_avgDpsXHealthGroup < n.state.m_avgDpsXHealthGroup
                && this->state.m_distToClosestEnemyGroup < n.state.m_distToClosestEnemyGroup); //TODO - DEFINE A PROPER OPERATOR 
    }


} SApair;

struct State
{
    State();

    Group m_avgDpsXHealthGroup;
    Group m_avgHealthGroup; //LOW, MID, HIGH
    Group m_distToClosestEnemyGroup;
    Group m_avgDpsXHealthEnemyGroup; 
    Group m_avgEnemyHealthGroup;
}

和这个枚举

typedef enum x{ATTACK   = 0, 
               HOLD     = 1, 
               FLEE     = 2,
               COUNT    = 3} Action;


typedef enum y{NA       = -1, //Not Available
               LOW      = 0,
               MID      = 1,
               HIGH     = 2} Group;

我有一张地图

std::map<SApair, float>* q_map;

在某一点上,地图包含单个元素(地图大小为1):

sapair = {m_avgDpsXHealthGroup=-1 m_avgHealthGroup=-1_distToClosestEnemyGroup=-1 ...}
action = 0.0f

我创建了一个新的SApair元素

SApair sapair = SApair(...);
sapair.state = {MID, LOW, HIGH, -1, -1} //This has been summed up by me for this stackoverflow post, but you get the idea
sapair.action = ATTACK;

所以,显然,sapair与q_map [0]中的不同。

然而,find方法似乎在q_map

中找到了sapair
if(q_map->find(sapair) != q_map->end())
{
    //I don't understand why it enters here
}

我错过了什么?

可能与&lt;在SApair中定义的运算符?

我当然无法弄清楚。

任何帮助将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:4)

operator<包含:

//TODO - DEFINE A PROPER OPERATOR

哪个是合适的,也是问题的根源。

目前,如果项目状态的所有三个属性小于与其进行比较的项目,则运营商仅返回true。如果现在例如项a的两个属性小于b且一个更大,则a < b返回false。

b < a也会返回false,因为只有b的属性小于a的相应属性。

由于ab都不小于彼此,因此认为它们相等。

由于意外项目被视为相同,因此在搜索find()项目时会导致意外结果。

更好的operator<()将是:

bool operator<( const SApair& n) const
{ 
    if (this->state.m_avgDpsXHealthEnemyGroup < n.state.m_avgDpsXHealthEnemyGroup)
        return true;
    if (this->state.m_avgDpsXHealthGroup < n.state.m_avgDpsXHealthGroup)
        return true;
    if (this->state.m_distToClosestEnemyGroup < n.state.m_distToClosestEnemyGroup)
        return true;
    return false;
}