Как использовать SGI STL hash_map? - PullRequest
0 голосов
/ 04 декабря 2008

Я пытаюсь использовать реализацию SGI STL, которую я скачал с их сайта. Я хочу использовать hashmap, потому что мне нужно хранить около 5.000.000 записей, но это должно быть хорошо: мне нужно иметь возможность очень быстро получить к нему доступ. Я пробовал stedext::hash_map, но это было очень медленно, потому что я не мог установить начальный размер. Кстати, возможно ли это сделать? Если я добавлю дополнительный путь к моей MS Visual Studio, я даже не смогу скомпилировать пример с сайта SGI. Я получаю сообщение об ошибке:

error C2061: syntax error : identifier 'T'.

Кто-нибудь еще сталкивался с такими проблемами?

Ответы [ 7 ]

2 голосов
/ 05 декабря 2008

Признаюсь, я не пробовал это для себя, но VS2008 должен поддерживать TR1, который содержит:

#include <tr1/unordered_map>

это в выпуске "Feature Pack". http://www.microsoft.com/downloads/details.aspx?FamilyId=D466226B-8DAB-445F-A7B4-448B326C48E7&displaylang=en

1 голос
/ 04 декабря 2008

Я использовал его несколько раз без проблем, хотя я использовал его с gcc (как для windows, так и для linux), а не для Visual Studio.

Для фактического использования документация: здесь .

Вы можете указать, сколько ведер зарезервировать, используя

void resize(size_type n)

Что касается вашей проблемы с идентификатором T , я предполагаю, что вы забыли заменить аргумент шаблона с именем T на фактический тип. Если вы не можете понять это, возможно, вставьте фрагмент кода того, как вы используете hash_map.

Пример из документации:

#include <hash_map>
#include <iostream>

struct eqstr
{
  bool operator()(const char* s1, const char* s2) const
  {
    return strcmp(s1, s2) == 0;
  }
};

int main()
{
  std::hash_map<const char*, int, hash<const char*>, eqstr> months;

  months["january"] = 31;
  months["february"] = 28;
  months["march"] = 31;
  months["april"] = 30;
  months["may"] = 31;
  months["june"] = 30;
  months["july"] = 31;
  months["august"] = 31;
  months["september"] = 30;
  months["october"] = 31;
  months["november"] = 30;
  months["december"] = 31;

  std::cout << "september -> " << months["september"] << endl;
  std::cout << "april     -> " << months["april"] << endl;
  std::cout << "june      -> " << months["june"] << endl;
  std::cout << "november  -> " << months["november"] << endl;
}

Конечно, вы можете использовать std :: string вместо char *, если хотите:

std::hash_map<std::string, int, hash<std::string>, eqstr> months;
0 голосов
/ 05 декабря 2008

Как было отмечено в ветке, которую я заметил на дискуссионном форуме об этой проблеме, реализация SGI STL, похоже, не обновлялась в течение очень долгого времени. На странице загрузки даже упоминается 8 июня 2000 года, когда он последний раз обновлялся. Я подозреваю, что заставить реализацию SGI STL работать под VS 2005/2008 - это больше проблем, чем стоит.

Я бы предложил проверить некоторые альтернативы STL ...

Оба регулярно обновляются.

0 голосов
/ 05 декабря 2008

Да, вы найдете только заголовочные файлы, указанные на веб-сайте SGI STL. Как вы заметили, зависимости ссылок относятся только к файлам .lib, так что не стоит добавлять что-либо туда.

Вы компилируете пример, опубликованный Дэном, все еще верно? Возможно, вам потребуется указать заголовки включения, используя кавычки, а не скобки. Так что пользуйтесь ...

#include "hash_map"

вместо ...

#include <hash_map>

Возможно, проблема в том, как компилятор ищет включаемые файлы. В качестве дополнительного запроса, какую версию Visual Studio вы используете?

0 голосов
/ 04 декабря 2008

Я скачал заархивированную версию этой библиотеки, в этом zip есть только заголовочные файлы. В Linker есть еще одна опция, она вызывает дополнительные зависимости, но там есть только файлы * .lib. Командная строка моих настроек выглядит так:

/Od /I "C:\SGI" /D "_MBCS" Gm /EHsc /RTC1 /MDd /Fo"Debug\\"/Fd"Debug\vc90.pdb" /W3 /nologo /c /ZI /TP /errorReport:prompt

Не знаю, может ли он быть более полезным ...

0 голосов
/ 04 декабря 2008

Звучит разумно. Какова структура вашего каталога STL? Вы получили все файлы SGI STL с их сайта или только один? Возможно, вам не хватает файла зависимостей, в результате которого вы видите ошибку.

0 голосов
/ 04 декабря 2008

Есть ли какие-либо другие сообщения об ошибках, которые появляются при попытке собрать / скомпилировать проект?
Вы упомянули вас ...

добавил дополнительный каталог в проект, где находится SGI STL.

Не могли бы вы немного рассказать об этом? Есть много мест, где вы можете добавить каталоги в настройках проекта Visual Studio. добавление дополнительных путей к заголовкам, дополнительных путей к библиотекам и т. д. Где вы добавили свой каталог?

...