0

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

error C2061: syntax error : identifier 'T'.

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

4

7 回答 7

2

我承认我自己没有尝试过,但是 VS2008 应该支持 TR1,其中包含:

#include <tr1/unordered_map>

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

于 2008-12-05T18:04:43.403 回答
1

我已经多次使用它而没有问题,尽管我将它用于 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;
于 2008-12-04T17:36:40.667 回答
0

是的,您只会找到 SGI STL 网站上指示的头文件。正如您所注意到的,链接依赖项仅适用于 .lib 文件,因此无需在其中添加任何内容。

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

#include "hash_map"

代替...

#include <hash_map>

这可能是编译器如何搜索包含文件的问题。作为附加询问,您使用的是什么版本的 Visual Studio?

于 2008-12-05T15:03:46.793 回答
0

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

于 2008-12-04T20:27:32.243 回答
0

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

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

两者都定期更新。

于 2008-12-05T17:08:34.467 回答
0

我已经下载了这个库的压缩版本,那个压缩包里只有头文件。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

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

于 2008-12-04T20:39:53.373 回答
0

当您尝试构建/编译您的项目时,是否还会显示任何其他错误消息?
你提到你...

在 SGI STL 所在的项目中添加了一个附加目录。

你能扩展一下吗?有很多地方可以在 Visual Studio 项目设置中添加目录。即添加额外的头文件路径、额外的库路径等。你在哪里添加你的目录?

于 2008-12-04T19:28:48.383 回答