int ID、文字列 NAME、文字列 LAST_NAME を含む構造体 ABC を定義しました。
私の手順は次のとおりです。入力ファイルから行を読み取ります。各行を名と姓に解析し、ABC 構造体に挿入します。また、構造体の ID は入力行の番号で与えられます。
次に、構造体をベクター マスターリストに push_back します。また、名と姓をキーワードとして使用して、これらを vector< vector > として定義されたハッシュテーブルにハッシュしています。あれは、
私のデータが次の場合:
Garfield Cat
Snoopy Dog
Cat Man
次に、キーワード Cash について、Garfield Cat と Cat Man を含むベクターへのハッシュを行います。もう一度 push_back を使用して構造体をハッシュテーブルに挿入します。
問題は、マスターリストで stable_sort を呼び出すと、何らかの理由でハッシュテーブルが影響を受けることです。曲の順序が異なっているために発生している可能性があると思ったので、マスターリストのコピーを作成して並べ替えてみましたが、元のマスターリストには影響しませんが、ハッシュテーブルにはまだ影響があります.
なぜこれが起こっているのでしょうか?
EDIT--投稿されたソースコード:
メインはこちら
ifstream infile;
infile.open(argv[1]);
string line;
vector<file> masterlist;
vector< vector<node> > keywords(512);
hashtable uniquekeywords(keywords,512);
int id=0;
while (getline(infile,line)){
file entry;
if (!line.empty() && line.find_first_not_of(" \t\r\n")!=line.npos){
id++;
string first=beforebar(line,0);
string last=afterbar(line);
entry.first=first;
entry.last=last;
entry.id=id;
masterlist.push_back(entry);
int pos=line.find_first_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");
while (pos!=(int)line.npos){
string keyword=getword(line,pos);
node bucket(keyword,id);
bucket.addentry(entry);
uniquekeywords.insert(bucket);
}
}
}
ハッシュテーブル挿入実装のスニペットは次のとおりです。
struct node{
string keyword;
vector<file> entries;
int origin;
void addentry(file entry);
node(string keyword, int origin);
};
void hashtable::insert(node bucket){
int key=hashfunction(bucket.keyword);
if (table[key].empty()){
table[key].push_back(bucket);
numelt++;
}
else{
vector<node>::iterator it;
it=table[key].begin();
while(it!=table[key].end()){
if (compare((*it).keyword,bucket.keyword)==0 && (*it).origin!=bucket.origin){
(*it).entries.insert((*it).entries.end(),bucket.entries.begin(),bucket.entries.end());
(*it).origin=bucket.origin;
return;
}
it++;
}
node bucketcopy(bucket.keyword,bucket.origin);
table[key].push_back(bucket);
numelt++;
return;
}
}