遇到麻烦,帮我看看代码!
Veeve 2003-06-11 10:14:00 //下面的程序的目的是为了求得两个元素为自定义类型的集合的差,
//其中TRecord为自定义类型,保存一条数据记录的字段名/字段值映射,
//以及其中的关键字段,在把该记录插入到set集合和求集合差的时候
//根据这些关键字段的值排序。
//现在的问题是最后并没有求得正确的集合差,而是把recordSet1中
//的记录全部拷贝到diffRecordSet中去了,不知道问题出在何处请高
//手相助!
//项目进度被几个算法问题卡了几天了,急死了!
//注:虽然是测试程序,但下面的代码是可用的,可以直接拷贝去调试
//***** test.cpp *****//
#include <vcl>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
typedef vector<AnsiString> TStrVec;
typedef map<AnsiString,AnsiString,less<AnsiString> > TStrMap;
class TRecord
{
public:
TRecord();
TRecord(const TRecord &);
const TRecord &operator=(const TRecord &);
bool operator==(const TRecord &) const;
bool operator<(const TRecord &) const;
TStrMap fieldsMap; //保存字段名和字段值的映射
TStrVec keyFields; //保存该记录的关键字段,用于根据这些字段的值判断记录的大小
private:
void mcopy(const TRecord &otherRecord);
};
TRecord::TRecord()
{
}
TRecord::TRecord(const TRecord &otherRecord)
{
mcopy(otherRecord);
}
const TRecord & TRecord::operator=(const TRecord &otherRecord)
{
if (&otherRecord!=this)
mcopy(otherRecord);
return *this;
}
bool TRecord::operator==(const TRecord &otherRecord) const
{
if (fieldsMap.empty() || otherRecord.fieldsMap.empty()) return false;
TStrVec::const_iterator p_key;
TStrMap::const_iterator p_this;
TStrMap::const_iterator p_that;
if (keyFields.size()!=0 && otherRecord.keyFields.size()!=0)
{
for (p_key=keyFields.begin();p_key!=keyFields.end();p_key++)
{
p_this=fieldsMap.find((*p_key));
if (p_this==fieldsMap.end()) return false;
p_that=otherRecord.fieldsMap.find((*p_key));
if (p_that==otherRecord.fieldsMap.end()) return false;
if ((*p_this).second != (*p_that).second) return false;
}
}
else
{
if (fieldsMap.size() != otherRecord.fieldsMap.size()) return false;
for (p_this=fieldsMap.begin();p_this!=fieldsMap.end();p_this++)
{
p_that=otherRecord.fieldsMap.find((*p_this).first);
if (p_that==otherRecord.fieldsMap.end()) return false;
if ((*p_this).second != (*p_that).second) return false;
}
}
return true;
}
bool TRecord::operator<(const TRecord &otherRecord) const
{
if (fieldsMap.empty()) return true;
TStrVec::const_iterator p_key;
TStrMap::const_iterator p_this;
TStrMap::const_iterator p_that;
if (keyFields.size()!=0 && otherRecord.keyFields.size()!=0)
{
for (p_key=keyFields.begin();p_key!=keyFields.end();p_key++)
{
p_this=fieldsMap.find((*p_key));
if (p_this==fieldsMap.end()) return true;
p_that=otherRecord.fieldsMap.find((*p_key));
if (p_that==fieldsMap.end()) return false;
if ((*p_this).second != (*p_that).second)
{
return ((*p_this).second < (*p_that).second);
}
}
}
else
{
for (p_this=fieldsMap.begin();p_this!=fieldsMap.end();p_this++)
{
p_that=otherRecord.fieldsMap.find((*p_this).first);
if (p_that==otherRecord.fieldsMap.end()) return false;
if ((*p_this).second != (*p_that).second)
return ((*p_this).second < (*p_that).second);
}
}
return true;
}
void TRecord::mcopy(const TRecord &otherRecord)
{
fieldsMap.clear();
keyFields.clear();
copy(otherRecord.fieldsMap.begin(),otherRecord.fieldsMap.end(),inserter(fieldsMap,fieldsMap.begin()));
copy(otherRecord.keyFields.begin(),otherRecord.keyFields.end(),inserter(keyFields,keyFields.begin()));
}
typedef set<TRecord,less<TRecord> > TRecSet;
int main(int argc, char* argv[])
{
TRecSet recordSet1,recordSet2,diffRecordSet; //源记录集合、记录集合差、
TRecord rec1,rec2,rec3;
rec1.keyFields.push_back("field1"); //把field1字段设为rec1的关键字段,根据该字段决定记录值的大小
rec1.fieldsMap.insert(TStrMap::value_type("field1","01")); //插入field1='01'的字段映射,下同
rec1.fieldsMap.insert(TStrMap::value_type("field2","abc"));
rec1.fieldsMap.insert(TStrMap::value_type("field3",""));
recordSet1.insert(TRecSet::value_type(rec1)); //把rec1插入到集合1中
rec2.keyFields.push_back("field1"); //field1字段设为rec1的关键字段
rec2.fieldsMap.insert(TStrMap::value_type("field1","02"));
rec2.fieldsMap.insert(TStrMap::value_type("field2","def"));
rec2.fieldsMap.insert(TStrMap::value_type("field3",""));
recordSet1.insert(TRecSet::value_type(rec2)); //把rec2插入到集合1中
rec3.keyFields.push_back("field1"); //把field1字段设为rec3的关键字段,根据该字段决定记录值的大小
rec3.fieldsMap.insert(TStrMap::value_type("field1","01"));
rec3.fieldsMap.insert(TStrMap::value_type("field2","abc"));
rec3.fieldsMap.insert(TStrMap::value_type("field3",""));
recordSet2.insert(TRecSet::value_type(rec3)); //把rec3插入到集合2中
//求集合1和集合2的差diffRecordSet
set_difference(recordSet1.begin(),recordSet1.end(),
recordSet2.begin(),recordSet2.end(),
inserter(diffRecordSet,diffRecordSet.begin()),
less<TRecord>()
);
//集合1中包含2条记录:
//记录1的值为:
//[keyFields:] "field1"
//[fieldsMap:] "field1"="01"
// "field2"="abc"
// "field3"=""
//记录2的值为:
//[keyFields:] "field1"
//[fieldsMap:] "field1"="01"
// "field2"="def"
// "field3"=""
//*****
//集合2中包含1条记录:
//记录1的值为:
//[keyFields:] "field1"
//[fieldsMap:] "field1"="01"
// "field2"="abc"
// "field3"=""
cout<<"diff size: "<<diffRecordSet.size()<<endl; //
return 0;
}