Как использовать SGI STL hash_map?

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

error C2061: syntax error : identifier 'T'.

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

7 ответов

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

#include <tr1/unordered_map>

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

Я использовал его несколько раз без проблем, хотя я использовал его с 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;

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

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

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

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

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

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

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

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

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

#include "hash_map"

вместо...

#include <hash_map>

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

Я скачал заархивированную версию этой библиотеки, в ней есть только заголовочные файлы. В 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

Я не знаю, является ли это более полезным...

Другие вопросы по тегам