紧急求救!STL set保存复合数据结构问题

teleinfor 2009-08-24 11:26:10
使用一个STL set集合保存一个符合数据结构如下:

struct _CELLID_INFO
{
unsigned int nLAC;
unsigned int nRAC;
unsigned int nCellID;
_CELLID_INFO ()
{
nLAC = 0;
nRAC = 0;
nCellID = 0;
}
//重载
bool operator < (_CELLID_INFO const& IdKey) const
{
if (nLAC<IdKey.nLAC)
{
return true;
}
else if (nRAC<IdKey.nRAC)
{
return true;
}
else if (nCellID<IdKey.nCellID)
{
return true;
}

return false;
}
} ;


执行insert操作时候提示 "invalid < ....",我怀疑是重载operator < 的结果。请教如何解决这个问题?
...全文
130 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
teleinfor 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lizmei001 的回复:]
我觉得应该不会出错,insert时不会调用 <
[/Quote]

你还需要好好学习。
teleinfor 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 omega_sta 的回复:]
执行insert出错的话
重载这样写试试
bool operator < (_CELLID_INFO const& IdKey) const
    {
        if (nLAC <IdKey.nLAC)
        {
            return true;
        }
        else if (nLAC == IdKey.nLAC)
        {
            if(nRAC <IdKey.nRAC)
            {
                return true;
            } else if(nRAC == IdKey.nRAC)
            {
                return nCellID <IdKey.nCellID;
            }
        }
        return false;
    }



[/Quote]

这个肯定可以的,太严密了。就是觉得复杂了点。效率是个问题。我修改了下,现在好了。

谢谢了。

解决方案如下:

//重载
bool operator < (_CELLID_INFO const& IdKey) const
{
if (nLAC<IdKey.nLAC)
{
return true;
}
else if (nLAC == IdKey.nLAC && nRAC<IdKey.nRAC)
{
return true;
}
else if (nLAC == IdKey.nLAC && nRAC == IdKey.nRAC && nCellID<IdKey.nCellID)
{
return true;
}
// >=
return false;
}


我一直这么写的,后来觉得繁琐就把 == 略去了,后来发现这样是不严密的。不符合strict weak ordering要求。

谢谢
teleinfor 2009-08-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 omega_sta 的回复:]
< 重载放在结构体外部
[/Quote]

跟这个没关系!
lizmei001 2009-08-25
  • 打赏
  • 举报
回复
我觉得应该不会出错,insert时不会调用<
Saingel 2009-08-25
  • 打赏
  • 举报
回复
执行insert出错的话
重载这样写试试
bool operator < (_CELLID_INFO const& IdKey) const
{
if (nLAC<IdKey.nLAC)
{
return true;
}
else if (nLAC == IdKey.nLAC)
{
if(nRAC<IdKey.nRAC)
{
return true;
} else if(nRAC == IdKey.nRAC)
{
return nCellID<IdKey.nCellID;
}
}
return false;
}


happysalay 2009-08-25
  • 打赏
  • 举报
回复
刚试了一下LZ的程序,没有报错,
_CELLID_INFO cc;
std::set<_CELLID_INFO> s;
s.insert(cc);
w29468 2009-08-25
  • 打赏
  • 举报
回复
参考:

typedef set<CString, bkLess<CString> > SETString;

template<class CString>
struct bkLess
{
bool operator()(const TCHAR * _Left, const TCHAR * _Right) const
{
return compare(_Left, _Right) < 0;
}
};
Saingel 2009-08-24
  • 打赏
  • 举报
回复
< 重载放在结构体外部

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧