教训:操作符重载需要面面俱到!
今天在实验代码中遇到一个问题,set 的insert函数不能给我插入两个不一样的结构体,纠结了一下午最终发现是我的 < 操作符重载 出现问题,原代码段如下:
ITEM item("S1 -> S",0,0,"#");
ITEM item1("S1 -> S",0,0,"=");
set<parser::ITEM> st1;
st1.insert(item1);
st1.insert(item);
set<parser::ITEM>::iterator it;
parser::ITEM xx;
for(it=st1.begin(); it != st1.end(); it++)
{
xx = (*it);
xx.print();//打印该结构体
}
此时< 操作符重载函数如下:
bool LR_ITEM::operator<(const LR_ITEM & item)const
{
if(item.GetNum() < NUM)return true;
else return item.POS < POS;
}
此时set之中只有item2。若上述函数改为:
bool LR_ITEM::operator<(const LR_ITEM & item)const
{
if(item.GetNum() < NUM)return true;
else if(item.GetNum() == NUM)
{
if(item.GetPos() == POS)return item.exp_symbol < exp_symbol;
else return item.GetPos() < POS;
}
}
可以得到预想的结果。