我已经定义了这些结构
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
中找到了sapairif(q_map->find(sapair) != q_map->end())
{
//I don't understand why it enters here
}
我错过了什么?
可能与&lt;在SApair中定义的运算符?
我当然无法弄清楚。
任何帮助将不胜感激。
感谢。
答案 0 :(得分:4)
operator<
包含:
//TODO - DEFINE A PROPER OPERATOR
哪个是合适的,也是问题的根源。
目前,如果项目状态的所有三个属性小于与其进行比较的项目,则运营商仅返回true
。如果现在例如项a
的两个属性小于b
且一个更大,则a < b
返回false。
但b < a
也会返回false,因为只有b
的属性小于a
的相应属性。
由于a
和b
都不小于彼此,因此认为它们相等。
由于意外项目被视为相同,因此在搜索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;
}