首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

小于符号重载有关问题

2013-02-17 
小于符号重载问题typedef struct tagBigramPairRecord{std::string aphstd::string nameint countint d

小于符号重载问题
typedef struct tagBigramPairRecord
{
        std::string aph;
        std::string name;
        int count;
        int distance;

        tagBigramPairRecord()
        {
                aph      = "";
                name     = "";
                count    = 0;
                distance = 0;
        }

        bool operator<(const tagBigramPairRecord & rsc) const
        {
                if (aph < rsc.aph)
                {
                        return true;
                }
                if (aph > rsc.aph)
                {
                        return false;
                }
                if (name < rsc.name)
                {
                        return true;
                }
                return false;
        }

        bool operator==(const tagBigramPairRecord & rsc) const
        {
                if (aph == rsc.aph && name == rsc.name)
                {
                        return true;
                }
                return false;
        }
} BigramPairRecord;


set<BigramPairRecord> candidate_records;
set<BigramPairRecord>::iterator set_iter = candidate_records.find(stBigramPairRecord);         


if (set_iter != candidate_records.end())
{
     set_iter->count    += stBigramPairRecord.count;
     set_iter->distance += stBigramPairRecord.distance;
 }


错误:
error: assignment of data-member 'tagBigramPairRecord::count' in read-only structure

请指点!
[解决办法]
此问题与小于重载什么的没有关系

你在尝试通过迭代器直接修改set内部数据,这是不允许的,如果要修改,需要先取得这份数据的拷贝,修改拷贝值后重新放进set内
[解决办法]
set内部用树来保存, 如果随便修改里面值的话, 也就造成树结构被破坏了. 所以set的iterator实际是const 指针, 如果要修改, 需要先删除再添加.


void test() 
{
BigramPairRecord stBigramPairRecord;
set<BigramPairRecord> candidate_records;
set<BigramPairRecord>::iterator set_iter = candidate_records.find(stBigramPairRecord); 
if (set_iter != candidate_records.end())
{
candidate_records.erase(set_iter);
BigramPairRecord newOne(*set_iter);
newOne.count    += stBigramPairRecord.count;
newOne.distance += stBigramPairRecord.distance;
candidate_records.insert(newOne);
//set_iter->count    += stBigramPairRecord.count;
//set_iter->distance += stBigramPairRecord.distance;
}
}

[解决办法]
ls的是错的,先删除了怎么再取?

    if (set_iter != candidate_records.end())
    {
        BigramPairRecord tmpRecord(*set_iter);
        tmpRecord.count    += stBigramPairRecord.count;
        tmpRecord.distance += stBigramPairRecord.distance;
        candidate_records.erase(BigramPairRecord++);
        candidate_records.insert(BigramPairRecord, tmpRecord)
    }

正确的修改方法,但是估计这不是lz想要的,因此给出另外一种不太推荐的方法

        const_cast<int&>(set_iter->count) += stBigramPairRecord.count;
        const_cast<int&>(set_iter->distance) += stBigramPairRecord.distance;

[解决办法]
不好意思上面的发错了

    if (set_iter != candidate_records.end())
    {
        BigramPairRecord tmpRecord(*set_iter);
        tmpRecord.count    += stBigramPairRecord.count;
        tmpRecord.distance += stBigramPairRecord.distance;
        candidate_records.erase(set_iter++);
        candidate_records.insert(set_iter, tmpRecord)
    }

正确的修改方法,但是估计这不是lz想要的,因此给出另外一种不太推荐的方法

        const_cast<int&>(set_iter->count) += stBigramPairRecord.count;
        const_cast<int&>(set_iter->distance) += stBigramPairRecord.distance;

热点排行