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

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

error C2061: syntax error : identifier 'T'.

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


person Community    schedule 04.12.2008    source источник
comment
Вы пробовали это? code.google.com/p/google-sparsehash   -  person strager    schedule 05.12.2008


Ответы (7)


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

#include <tr1/unordered_map>

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

person Community    schedule 05.12.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;
person Community    schedule 04.12.2008

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

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

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

person Rob Segal    schedule 04.12.2008

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

person Rob Segal    schedule 04.12.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

Я не знаю, более ли это удобно....

person Community    schedule 04.12.2008

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

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

#include "hash_map"

вместо...

#include <hash_map>

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

person Rob Segal    schedule 05.12.2008

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

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

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

person Rob Segal    schedule 05.12.2008