1

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;
  }
}
4

1 に答える 1

2

どれどれ。次のいずれかになります。

  1. ハッシュテーブルの実装が壊れています。
  2. ハッシュ関数が壊れています。
  3. 何らかの方法で並べ替えを行うと、保存したもののセマンティック値が変更されます。並べ替えられたベクトルは、並べ替えられていないベクトルとは異なる値を持っています。

実際には、これらのどれが問題の原因であるかは問題ではありません。これの代わりに、あなたがstd::mapコンテナになる必要があります。何らかの理由でハッシュ テーブルの実装を絶対に使用する必要がある場合は、少なくとも次のような比較的標準的なハッシュ コンテナーを使用します。

  • std::unordered_mapC++11 をサポートするコンパイラで提供
  • ブーストのboost::unordered_map
  • std::tr1::unordered_map
  • hash_map多くのコンパイラに付属

上記は、おそらく試してみるべき順序で並べられていることに注意してください。

于 2010-04-02T02:54:27.807 に答える