读书人

小于符号重载有关问题

发布时间: 2013-02-17 10:44:46 作者: rapoo

小于符号重载问题
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;

读书人网 >C++

热点推荐