Почему stable_sort может влиять на значения моей хеш-таблицы?

Я определил структуру ABC, содержащую идентификатор int, строку NAME, строку LAST_NAME;
Моя процедура такова: чтение строки из входного файла. Разберите каждую строку на имя и фамилию и вставьте в структуру ABC. Кроме того, идентификатор структуры задается номером строки ввода.

Затем вставьте структуру в векторный мастер-лист. Я также хэширую их в хэш-таблицу, определенную как вектор‹ вектор>, используя имя и фамилию в качестве ключевых слов. То есть,

Если мои данные:
Кот Гарфилд
Снупи Дог
Человек-Кот

Затем для ключевого слова cash хеширует вектор, содержащий Garfield Cat и Cat Man. Я снова вставляю структуры в хеш-таблицу, используя push_back.

Проблема в том, что когда я вызываю стабильную_сортировку в своем мастер-листе, по какой-то причине это влияет на мою хеш-таблицу. Я подумал, что это может происходить из-за того, что песни упорядочены по-разному, поэтому я попытался сделать копию мастер-листа и отсортировать его, и это все еще влияет на хеш-таблицу, хотя исходный мастер-лист не затрагивается.

Любые идеи, почему это может происходить?

РЕДАКТИРОВАТЬ - опубликован исходный код:

Вот главное

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

person zebraman    schedule 01.04.2010    source источник
comment
Не могли бы вы опубликовать свой код? Описание того, что вы думаете делать, зачастую менее полезно, чем размещение фактического кода, особенно когда речь идет об алгоритмических проблемах.   -  person Dan Story    schedule 02.04.2010
comment
извините немного коряво. Я не хотел выкладывать все сюда. есть несколько файлов. но это важные вещи.   -  person zebraman    schedule 02.04.2010
comment
Почему именно вы делаете это вместо использования std::map или чего-то вроде нестандартного hash_map или boost::unordered_map?   -  person Billy ONeal    schedule 02.04.2010
comment
Ваш опубликованный код не содержит вызова stable_sort.   -  person Potatoswatter    schedule 02.04.2010


Ответы (1)


Давайте посмотрим. Это может быть одна из следующих вещей:

  1. Ваша реализация хеш-таблицы не работает.
  2. Ваша хэш-функция сломана.
  3. Каким-то образом сортировка изменяет семантическую ценность того, что вы сохранили. Отсортированный вектор, безусловно, имеет значения, отличные от несортированного вектора.

На самом деле не имеет значения, какой из них является причиной проблемы. Вместо этого вы должны быть контейнером std::map. Если по какой-то причине вам абсолютно необходимо использовать реализацию хеш-таблицы, используйте хотя бы относительно стандартный хеш-контейнер, такой как:

  • std::unordered_map предоставляется на компиляторах с поддержкой C++11
  • буст boost::unordered_map
  • std::tr1::unordered_map
  • hash_map поставляется со многими компиляторами
  • и т.п.

Обратите внимание, что вышеперечисленное упорядочено в том порядке, в котором вы, вероятно, должны их попробовать.

person Billy ONeal    schedule 02.04.2010