如何使用SGI STL hash_map?

时间:2008-12-04 17:27:41

标签: stl hashmap sgi

我正在尝试使用我从他们网站下载的SGI STL实现。我想使用一个hashmap,因为我必须存储大约5.000.000条记录,但它应该是好的:我需要能够非常快速地访问它。我已经尝试了stedext::hash_map,但它非常慢,因为我无法设置初始大小。顺便说一下,这样做有可能吗? 如果我将附加路径添加到MS Visual Studio,我甚至无法从SGI站点编译示例。我收到一条错误消息:

error C2061: syntax error : identifier 'T'.

还有其他人遇到过这样的问题吗?

7 个答案:

答案 0 :(得分:2)

我承认我没有为自己尝试过,但VS2008应该支持包含以下内容的TR1:

#include <tr1/unordered_map>

它位于“功能包”版本中。 http://www.microsoft.com/downloads/details.aspx?FamilyId=D466226B-8DAB-445F-A7B4-448B326C48E7&displaylang=en

答案 1 :(得分:1)

我已经多次使用它没有问题,虽然我使用它与gcc(在Windows和Linux上)而不是Visual Studio。

对于实际使用,文档为here

您可以使用

指定要保留的存储区的数量
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;

答案 2 :(得分:0)

当您尝试构建/编译项目时是否还有其他错误消息? 你提到了你......

  

为a添加了一个额外的目录   SGI STL所在的项目。

你能扩展一下吗?您可以在Visual Studio项目设置中添加许多目录。即添加其他包含标题路径,其他库路径等。您在哪里添加目录?

答案 3 :(得分:0)

这听起来很合理。您的STL目录的结构是什么?您是从他们的网站获得所有SGI STL文件还是只获得一个?可能是您缺少一个依赖文件,导致您看到的错误。

答案 4 :(得分:0)

我已下载此库的压缩版本,该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

我不知道它是否更有用......

答案 5 :(得分:0)

是的,您只能找到SGI STL网站上显示的头文件。正如您所注意到的,链接依赖性仅适用于.lib文件,所以不必在那里添加任何内容。

您正在编写Dan发布的示例吗?您可能需要使用引号而不是括号来指定包含标头。所以使用......

#include "hash_map"

而不是......

#include <hash_map>

编译器如何搜索包含文件可能是一个问题。另外,您正在使用哪个版本的Visual Studio?

答案 6 :(得分:0)

正如我在一个关于这个问题的讨论论坛上发现的一个帖子所指出的那样,SGI STL实现似乎在很长一段时间内都没有更新。在下载页面上,它甚至提到2000年6月8日是最后一次更新。我怀疑让SGI STL实现在VS 2005/2008下运行比它的价值更麻烦。

我建议查看一些STL替代品......

两者都定期更新。