问题标签 [unordered-map]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
976 浏览

c++ - C++:帮助使用用户定义的哈希/等式创建 unordered_map

我正在尝试使用用户定义的哈希函数和相等谓词为整数内置类型的矩阵行创建一个 std::unordered_map。我使用 std::bind,因为我需要散列和相等函子来处理变量范围。我将如何获得以下代码以按预期编译和工作?我猜我的错误是在列表的底部,我使用 std::bind 并实例化 std::unordered_map。

一些澄清:

我不能使用 boost::hash_combine 因为我关心存储在矩阵行中的整数中的各个位,所以除非我创建自己的迭代器,否则 boost::hash_combine 会组合整个整数,从而导致错误的结果。此外,我需要散列和相等函子在 1 到 ~200,000 的范围内工作,因此在模板参数中指定范围不是一个合理的选择。

错误:

这是(我认为)尝试编译时产生的错误中最重要的部分:

/usr/include/c++/4.6/bits/stl_pair.h:92:11: 错误:'std::pair<_T1, _T2>::first' 类型不完整 /usr/include/boost/numeric/ublas/fwd .hpp:73:11: 错误: 'const struct boost::numeric::ublas::matrix_row, boost::numeric::ublas::unbounded_array > > >'的声明</p>

如果您想查看全部内容,我已将其全部倾倒在这里:

code>

0 投票
2 回答
2392 浏览

c++ - 我可以将对象插入 tr1 unordered_map

我有大量数据要在 c++ 中处理,发现 unordered_map 有效但是,没有将对象存储在 unorderd_map 中的示例。当我尝试自己时,它无法遵守。

首先我包含 unordered_map

然后定义类型

Vector3f 这里是我创建的类。当我在上面编译时,它不会返回任何错误。但是,当我添加

编译器返回一大段错误,请您告诉我插入对时是否有问题,或者它未排序不支持插入对象,如果不是,是否有任何其他有效的方式来存储和搜索对象对,如 hashmap in爪哇。以下是编译器中的错误消息报告:

这是 Vector3f 类

0 投票
3 回答
1106 浏览

c++ - 如何在 unordered_map 的键中使用 std::tr1::function 对象?

我正在尝试形成一个 std::tr1::unordered_map ,其中键类型是一个包含回调函数的结构,为此我正在使用 std::tr1::function。我遇到了两个问题:1)函数对象似乎不具有可比性,如 Boost.Function 文档所示;2)我看不到如何实现散列函数,因为我无法从函数对象中获取常规函数指针(或其他我可以用于散列的东西)。

这是示例代码:

这是有关第一个错误的一些详细信息:

对于第二个错误,显然没有 function<...>::get 成员,但我应该改用什么?

我正在使用 Boost 版本 1.42 和 g++ 4.2.2。谢谢你的帮助。

更新

发布的问题的答案是“你不能”。tr1::function 对象是可散列的(例如,使用 boost::hash),但不能相等比较。如果您想在哈希键中使用函数,请重新考虑方法或找到解决方法。

0 投票
2 回答
4979 浏览

c++ - 为什么我不能用 std::unordered_map 替换 std::map

这个问题可能有点粗略,因为我家里没有可用的代码,但我知道这件事否则会困扰我整个周末。

当我尝试将一些代码更新为 C++11 时,我开始std::mapstd::unordered_map. 该代码仅用于std::map::find()访问地图中的特定元素,因此我认为替换应该很容易。返回的迭代器存储在一个auto-typed 变量 ( auto res = map.find( x ),所以打字应该检查正常。但是,当使用我访问存储的元素时,res->second.do_stuff()我得到一个编译器错误,告诉我,struct std::pair<char, B> does not have a member second。现在这真的让我很困惑,但不幸的是我没有有时间进一步调查。

也许这是足够的信息,所以有人可以给我一个关于这个奇怪的编译器错误的提示。或者我的理解是除了需要订购的部分之外应该具有相同的界面,不正确std::mapstd::unordered_map

编辑

正如这里所承诺的,对这个问题进行了更多的分析。这很可能会让有人现在更好地帮助我。正如我从评论中的提示中猜测的那样,这并不是真正由我访问地图中的元素的点引起的,而是由代码的其他部分引起的。我发现的原因是,我使用 X 类中的映射来存储指向 X 类其他元素的指针(一种树结构)。然而,这似乎适用于std::map但不适用于std::unordered_map. 这是一些非常简单的代码,它显示了这个问题:

std::map工作std::unordered_map不工作。任何想法为什么会这样,或者可以做些什么来让它与 a 一起工作std::unordered_map

0 投票
5 回答
106927 浏览

c++ - 从 unordered_map 获取键和值列表

vector从 a 获取键和值的列表(作为 a )的最有效方法是unordered_map什么?

具体而言,假设所讨论的地图是unordered_map<string, double>. 然后我想将键作为 a vector<string>,将值作为 a vector<double>

我可以遍历地图并收集结果,但有没有更有效的方法?有一个也适用于常规地图的方法会很好,因为我可能会切换到那个。

0 投票
1 回答
757 浏览

c++ - C++:unordered_map,迭代器不可比较

我有一个unordered_map并且无法比较 and 返回的迭代find()end()。情况如下:

哪里IpAddressPort只是一些structIpAddressPortKey看起来像这样

块中的比较if给出了这个错误:

知道是什么原因造成的吗?

0 投票
1 回答
411 浏览

c++ - unordered_map (A) 构造函数,(B) 删除分配,(C) 继承自

我的声明是unordered_map<Comparison,int> Chs什么时候Comparison是一个类名。现在我有几个问题;

A. 当构造函数调用时,我如何插入一些元素(如 done with vector)?

例如:

此代码现在得到编译错误。

B. 如何释放new在这个声明中分配的内存(with)?

C. 在继承类中:

我应该如何编写RC构造函数,以便它可以使用像 A question 这样的元素进行初始化?

谢谢你,对我糟糕的英语感到抱歉。

0 投票
0 回答
300 浏览

c++ - C++ 外部 boost::unordered_map 麻烦多线程

我正在尝试将 boost::unordered_map 用作全局变量,其中两个线程(具有相对互斥锁)在其上工作。尽管带有整数的简单版本可以工作,但 boost::unordered_map 版本将无法工作。

在 global.hpp: extern boost::unordered_map my_namespace::_cache;

主要是:

在线程 1

在线程2

第一次调用后预期的值应该是 3,而不是 -1。我认为这是一个初始化/分配问题

提前致谢。

0 投票
2 回答
2126 浏览

c++ - 如何使 boost unordered_map 支持享元

我正在尝试执行以下操作:

但是编译器抱怨:“错误 C2665:'boost::hash_value':17 个重载中没有一个可以转换所有参数类型”。

但我已经定义了以下功能:

但它不编译。

我需要做什么才能使 boost unordered_map 支持享元?

[编辑] 我让它使用以下代码:

并将其作为模板参数传递给地图的构造:

在这种情况下,我不明白重载 hash_value 的方式不起作用。

0 投票
1 回答
12332 浏览

c++ - unordered_map 如何导致 sigsegv

编辑:解决了,我知道怎么做,但我不明白为什么。

我改变了variables声明

它工作正常。

如果您知道原因,请将其写在答案中。

我有一个非常大的程序,所以我不知道我应该把哪个代码带到这里。

有抽象类,它与派生类一起继承。摘要有unordered_map<int,int>(模板)作为私有成员和公共方法insert(int,int)

派生类使用基类insert方法向unordered_map<int,int>容器中插入元素,

第一个int使用类似计数器并从 0 开始。前 11 个插入元素正常,但在第 12 个元素中我得到 sigsegv,并struct equal_to在 stl_function.h(209) 处出错。

在调试器中,我看到 unordered_map 的 bucket_count 等于 11,这可能是一些线索。

我的编译器是 gcc 4.6.1。

也许您可以概括地写出什么导致 sigsegv in unordered_map.insert

谢谢你,对我糟糕的英语感到抱歉。

我会带上具体的代码,如果我知道的话。

编辑:这是insert方法:

声明是:

sigsegv 发生在arrayPlace==11 时,与value相等无关。