- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以,伙计们,我玩 std::unordered multimap
只是为了好玩。我想存储(在本例中)unsigned short
,带有自定义哈希值和相等值。
有趣的部分是什么?如果两个项目都是偶数或奇数,则两个项目相等。
因此,据我所知,我不能使用 std::unordered_map
,即使实际值不同:自定义谓词另有说明。 (显然,如果我错了,请纠正我!)
回顾一下:我存储不同整数,因此存储不同散列,但它们在谓词下的值可能相同。 p>
#include <iostream>
#include <unordered_map>
class tt
{
public:
tt(const unsigned short v = 0) : i(v) { };
unsigned short i;
};
class tt_hash
{
public:
size_t operator()(const tt &v) const
{
auto f = std::hash<unsigned short>();
return f(v.i);
};
};
class tt_equal
{
public:
bool operator()(const tt &u, const tt &v) const
{
return (u.i % 2) == (v.i % 2);
};
};
typedef std::unordered_multimap<tt, bool, tt_hash, tt_equal> mymap;
// Print all values that match a criteria
void f(const mymap &m, unsigned short c)
{
auto range = m.equal_range(c);
auto target = range.first;
if (target == m.end())
{
std::cout << "not found : " << (int) c << std::endl;
}
else
{
for (auto i = target; i != range.second; i++)
std::cout << "there is : " << (int) i->first.i << " : " << i->second << std::endl;
}
}
int main(int argc, const char * argv[])
{
mymap m;
m.emplace(std::make_pair(tt(3), false));
m.emplace(std::make_pair(tt(10), true));
m.emplace(std::make_pair(tt(4), true));
m.emplace(std::make_pair(tt(23), false));
std::cout << "size " << m.size() << std::endl;
std::cout << "buck " << m.bucket_count() << std::endl;
int c = 0;
for (auto i = m.begin(); i != m.end(); i++)
std::cout << "# " << c++ << " : " << (int) i->first.i << " : " << i->second << std::endl;
f(m, 3);
return 0;
}
所以,当我执行上面的代码时,我找到了正确的值,3、10、4、23(当然不是这个顺序)。
出乎意料的是,当调用 f()
打印所有匹配 3 的值时,我得到了两个答案,3 和 23;但是当我要求 1000 时,我希望打印出所有偶数,但我错了:
size 4
buck 5
# 0 : 4 : 1
# 1 : 10 : 1
# 2 : 3 : 0
# 3 : 23 : 0
there is : 10 : 1
我是不是漏掉了什么? (答案显然是肯定的)
最佳答案
你正在做的是未定义的行为:相等的元素应该有相等的散列值。根据标准(强调我的)
23.2.5 无序关联容器[unord.req]
5 Two values k1 and k2 of type Key are considered equivalent if the container’s key equality predicate returns true when passed those values. If k1 and k2 are equivalent, the container’s hash function shall return the same value for both.
由于您根据模 2 定义等价性,因此您还需要对传递的整数的模 2 使用散列函数。这也意味着只要您拥有 2 个以上的元素,您就需要 std::unordered_multimap
。
关于c++ - 玩 unordered_multimap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17783622/
我正在尝试创建一个数据库来处理我在 Play 中的任务!框架。 这是我所拥有的: 在build.sbt中: libraryDependencies ++= Seq( jdbc, cache,
在我的游戏中定义一个表单!当编译器吐出这个奇怪的错误时 Controller :重载方法值映射与替代:...[一堆废话]...Error occurred in an application invo
我的应用程序有问题,@Max约束注释。 我的 Controller 方法定义如下: public static void save(@Required @Max(255) String content
我想创建一个像这样的标签: #{some_tag entity:user, field:'name'} 并期望它通过使用如下表达式生成带有用户名的输出: ${_entity._field} 我知道这行
我创建了一些 Model 对象来代表一家拥有多个客户的公司,以及一个由公司和客户组合以及多个发票行组成的发票对象。我创建了以下模型对象: @Entity public class Company ex
Playframework 现在是 typesafe-stack 的一部分。 那么,如果我要使用像主要语言一样的 Scala ,我现在应该下载什么? TypsafeStack 还是 PlayFrame
在玩!如果你这样称呼: void method() { User u = User(); u.name = "bob"; u.save(); while(true){/* endless loop *
我正在 Play 中构建一个应用程序!包含大量我想跟踪更改的数据的框架。在企业解决方案中,我可能会使用数据库触发器将更改复制到历史表中以跟踪这些更改。我不熟悉 Play!/JPA 中的类似范例,但也许
我一直在学习JavaScript技能,但是遇到一个问题,当单击此处是我的代码时,音频没有被播放。 Your browser does no
我想实现在某些模型保存后在表中插入一行的行为。我当前的解决方案简而言之是:(这只是我的代码示例,因此请不要评论数据库或描述符模型的正确性)。 我有一个监听器,用于在更新/插入实体上插入行为行 Desc
如何使我的模型类字段独一无二?例如。如果已经登录,我想为用户显示正确的消息。我必须自己编写验证检查并使用它,或者可以使用 JPA @UniqueConstraint? 最佳答案 我是这样做的: @En
我使用的是 Play 1.2.1。我想对我的用户密码进行哈希处理。我认为 Crypto.passwordHash 会很好,但事实并非如此。 passwordHash 文档说它返回 MD5 密码哈希值。
我一直在研究戏剧!框架模块并希望扩展它,添加一些功能。我发现了一个从Enhancer(play.classloading.enhancers.Enhancer)扩展的类,但不明白为什么Play!采用了
我使用的是 Play Framework 1.2.5。我有几个与 NAme 和 Age 字段相关的验证。年龄验证无法正常工作。即使年龄大于 18 岁,我也会收到错误消息。 下面是action方法中的验
我使用的是 Play Framework 1.2.5。两者有什么区别: @{Application.render()} 和 @Application.render() 第一个最好用在表单 Action
我是新来的!我被一些总是有错误的表格所困扰。即使所有字段都已填写,我也无法弄清楚问题是什么。 路线 GET /products/ controllers.Pr
我显示可编辑的数据库表行的列表。我想允许用户编辑显示表中的数据并同时保存所有更新。我应该如何取回 Controller 的更新列表? 最佳答案 由于 Play 可以绑定(bind)到 POJO,也可以
那么,假设我从 Controller 异步启动一个作业,然后渲染一些模板。 MyJob job = new MyJob(); job.doJob(); render(); 我的工作看起来像: 导入 p
当前使用的 Play Framework 为 2.0.4。当我尝试使用此命令升级到 2.6.21 时: addSbtPlugin("com.typesafe.play"% "sbt-plugin"%
我目前正在与 Play 合作!框架和看来日志记录只适用于游戏!仅但对于具有 LOGGER 初始化的类不起作用。 这是 logback.xml ${application.hom
我是一名优秀的程序员,十分优秀!