Как использовать 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...
- Порт STL - http://www.stlport.org/download.html
- Повышение - http://www.boost.org/
Оба регулярно обновляются.
Есть ли другие сообщения об ошибках, которые появляются при попытке собрать / скомпилировать проект?
Вы упомянули вас...
добавил дополнительный каталог в проект, где находится 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
Я не знаю, является ли это более полезным...