首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >How to make a c++11 std::unordered_set of std::weak_ptr

How to make a c++11 std::unordered_set of std::weak_ptr
EN

Stack Overflow用户
提问于 2012-12-04 03:30:42
回答 4查看 8.5K关注 0票数 15

我有一个这样的集合:set<weak_ptr<Node>, owner_less<weak_ptr<Node> > > setName;

它工作得很好。但是我想把它改成一个无序的集合。然而,当我这样做的时候,我得到了大约六页的错误。你知道怎么做吗?

在浏览了所有页面的错误消息后,我找到了可能有帮助的代码行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/usr/include/c++/4.7/bits/functional_hash.h:60:7: error: static assertion failed: std::hash is not specialized for this type
/usr/include/c++/4.7/bits/stl_function.h: In instantiation of ‘bool std::equal_to<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = std::weak_ptr<Node>]:
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-04 15:30:16

请阅读下面的 答案,因为我的答案是不正确的,尽管我是公认的解决方案。

由于unordered_sets是基于散列的,因此必须为std::weak_ptr数据类型提供散列function object

如果您查看unordered_set模板参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<class Key,
    class Hash = std::hash<Key>,
    class Pred = std::equal_to<Key>,
    class Alloc = std::allocator<Key> >
    class unordered_set;

您会注意到,std::unordered_set为您提供了一个默认的std::hash<>模板参数。但是,由于std::hash只为数据类型的specific set提供专门化,您可能需要提供自己的专门化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<typename T>
struct MyWeakPtrHash : public std::unary_function<std::weak_ptr<T>, size_t> {
   size_t operator()(const std::weak_ptr<T>& wp)
   {
      // Example hash. Beware: As zneak remarked in the comments* to this post,
      // it is very possible that this may lead to undefined behaviour
      // since the hash of a key is assumed to be constant, but will change
      // when the weak_ptr expires
      auto sp = wp.lock();
      return std::hash<decltype(sp)>()(sp);
   }
};

编辑:您还需要提供一个相等函数,因为没有提供weak_ptr的std::equal_to。在"Equality-compare std::weak_ptr" on Stackoverflow中采用一种可能的方法来完成此操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<typename T>
struct MyWeakPtrEqual : public std::unary_function<std::weak_ptr<T>, bool> {

   bool operator()(const std::weak_ptr<T>& left, const std::weak_ptr<T>& right)
   {
      return !left.owner_before(right) && !right.owner_before(left);
   }
};

所有这些结合在一起,给我们提供了以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
std::unordered_set<std::weak_ptr<T>,
                   MyWeakPtrHash<T>,
                   MyWeakPtrEqual<T>> wpSet;
票数 1
EN

Stack Overflow用户

发布于 2015-06-18 17:49:25

简短而不幸的答案是,虽然shared_ptr<>可以安全地用作无序集合或映射中的键,但weak_ptr<>不能也不能。再多的花招也不能保证它的安全。

这是因为weak_ptr的接口不公开对共享控制对象的访问,这是在有序集或映射中使用时按owner_before()进行比较的基础。

虽然锁定指针然后散列shared_ptr似乎是合理的,但事实并非如此。如果最后一个shared_ptr超出作用域,则哈希值将更改,这将导致下次迭代您的集或映射时出现未定义的行为。这很可能不会被注意到,直到你的代码在客户面前生产,你偶尔会遇到意想不到的和莫名其妙的功能损失,但你的单元测试仍然会毫无瑕疵地通过,给你一个错误的想法,你的测试覆盖率很好,你的代码是可靠的,应该归咎于用户、硬件或网络。

因此,总而言之,如果您打算使用weak_ptr来构建您的无主对象缓存(它们非常适合),那么您需要使用std::set<weak_ptr>并遭受极小的性能影响(尽管在现实中,这与保护set的mutex所造成的性能损失相比会相形见绌)。

如果你真的想使用一个weak_ptr作为一个无序键,你必须自己编写(提示:使用共享控制块的地址作为散列函数的基础)。

票数 24
EN

Stack Overflow用户

发布于 2014-03-01 05:48:07

我不认为建议的散列函数是正确的。如果指向该对象的所有共享指针都消失了,则weak_ptr<X>::lock()将返回空的shared_ptr,其散列值可能为零。因此哈希函数可以在一段时间内返回不同的值。

我认为正确的解决方案是使用boost::unordered_map<X*, boost::weak_ptr<X>>。类型X*可以很容易地用作散列映射的关键字,而weak_ptr<X>作为值让您有机会了解被引用的对象是否仍然存在。

要将值存储到此哈希中,您可以使用以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (boost::shared_ptr<X> p = wp.lock()) {
    // weak_ptr is still valid
    ptrs.insert(std::make_pair(p.get(), p));
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13695640

复制
相关文章
美国家网络空间靶场(NCR)2
上述小节简要描述了美国《国家网络空间靶场》(NCR)【以下简称NCR】的一些背景信息,了解到了NCR是基于美国《国家网络安全综合倡议》(CNCI)下的一个实施部分。美国《国家网络安全综合倡议》(CNCI)计划总投资300亿~400亿美元,为其计划中包含的12个重点领域活动领域进行投资,其中《国家网络空间靶场》(NCR)是最重要的内容之一。
时间之外沉浮事
2019/12/03
2.3K0
redux-sage笔记
tips: effects纯文本Javascript对象 - call - call() 调用给定函数。注意的是,如果call调用fetch,在默认的fetch状态下返回的是Promise实例,但是由于是call调用,返回的是文本信息,可以直接调用 - put - put({type: 'INCREMENT'}) 发起一个action到store - take 第二个参数表示对应匹配的action所要执行的函数。第一个参数如果是数组的话,表示可以并发监听action - 可以更好的控制状态流 - 如下一个函数控制登陆和登出
ACK
2020/01/14
7280
2016新版paypal 关闭PayPal预付款,避免自动续费
对于经常购买国外主机的我来说使用paypal的频率非常的高,之前也遇到过paypal账号里面的资金被自动扣除,也发现不少伙伴也遇到这样的问题!其实这也不能怪商家,在大家进行购买的时候就会有提醒的,也就自动续费吧。主要原因还是在于自己,现在来说说如何关闭paypal预付款,避免自动扣费。
用户1191760
2019/02/27
3.5K0
美国最大燃油管道商遭受网络攻击,美国进入国家紧急状态
当地时间5月7日,美国顶级燃油管道运营商Colonial Pipeline受到网络攻击,在受攻击的当天,Colonial Pipeline在声明表示:在得知当天受到某些“信息技术”或业务网络系统的网络攻击后,该公司已暂时关闭了所有管道运营。5月8日,该公司证实该攻击涉及勒索软件,并通知了执法部门和其他联邦机构。5月9日,美国宣布进入国家紧急状态。
IRTeam-工业安全
2022/05/10
8880
美国最大燃油管道商遭受网络攻击,美国进入国家紧急状态
美国国家实验室利用机器学习预测地震
据《科学美国人》报道,预测地震是地震学长期追寻的目标。毕竟,地震是致命的,正是因为它们没有规律——不期而至,引发火灾和海啸,有时夺取成千上万条性命。如果科学家能够在大地震到来前数周或数月对公众发出警告,就能进行疏散和其他准备,拯救无数的生命。 即使很多科学家都进行了努力,但到目前为止还没有人找到可靠的方法来预测地震。有些专家认为这是徒劳的尝试。美国洛斯阿拉莫斯国家实验室(Los Alamos National Laboratory)的地球物理学家保罗·约翰逊(Paul Johnson)表示,“如果你说自己打
人工智能快报
2018/03/07
8530
TikTok或被美国禁用!白宫称威胁美国国家安全,呼吁民众谨慎下载
周一,美国国务卿Mike Pompeo表示,美国或将禁止中国多款社交媒体软件,其中就包括在海外多国大火的抖音国际版TikTok。
大数据文摘
2020/07/14
4730
TikTok或被美国禁用!白宫称威胁美国国家安全,呼吁民众谨慎下载
PayPal宣布裁员2000人!
当地时间1月31日,在线支付厂商PayPal宣布将裁员 2000 人,约占总员工数 7%,消息一出,PayPal 当日股票收涨 2%。
芯智讯
2023/02/09
7500
美国国家仪器考虑出售,股价一度大涨19%
1月14日消息,当地时间周五,美国国家仪器有限公司(National Instruments Corp,简称“NI”)宣布,在权衡其战略选择时,它在探索包括将公司出售在内的战略。
芯智讯
2023/02/09
1810
美国《国家防御授权法案》将保障人工智能发展
【概要】新美国安全中心的研究人员撰文分析了美国“国家防御授权法案”中有关人工智能的内容及影响,并比较了中美之间的相应战略。
人工智能快报
2018/10/24
4930
美国国家网络靶场系统架构与设计原理剖析①总论
美国“国家网络靶场”(NCR)是美军研发的网络安全试验与演练评估靶场,主要为模拟真实的网络攻防作战提供虚拟网络环境,并针对敌对网络攻击等作战手段进行网络安全试验。该网络靶场最初由国防高级研究计划局在2008年5月1日开始筹建,于2013财年移交给国防部试验资源管理中心运行管理。2016年,美国试验资源管理中心(TRMC)进一步加大了国家网络靶场投资与建设规模,不断扩大其在武器系统采办项目中的网络安全试验鉴定功能,以及作战部队网络训练演习评估规模。为了满足对网络安全测试和评估(T&E)和国防部(DoD)网络任务部队(CMF)培训和认证不断增长的需求,美国试验资源管理中心经过一项NCRC计划,通过创建类似于美国“国家网络靶场”的设施的互连综合体来提高美国“国家网络靶场”的容量,这个计划被称为NCRC。这些新的美国“国家网络靶场”节点位于:南卡罗来纳州查尔斯顿、马里兰州Patuxent River和佛罗里达州埃格林空军基地。目前随着NCRC的招标结束,新建的三大美国“国家网络靶场”节点正陆续构建并交付使用。
时间之外沉浮事
2021/01/14
2K0
美国斥资110亿美元建国家半导体技术中心
4月26日消息,据彭博社报导,美国政府计划斥资 110 亿美元建立国家半导体技术中心,之后还将在各地建立据点,与学术界和产业界伙伴合作,连结成为先进芯片设计与工程设施网络,推动产品创新和劳动力发展,加强美国经济与安全。计划目标是 2023 年底前启动执行。
芯智讯
2023/05/09
2360
美国斥资110亿美元建国家半导体技术中心
靶场发展态势④美国家网络空间靶场(NCR)1
美《国家网络空间靶场》(NCR)和美国防部建设的JIOR以及JCOR等纯军事靶场不同,美《国家网络空间靶场》(NCR)是DARPA为美国《国家网络安全综合倡议》(CNCI)提供的一个“测试平台”,用于对各种网络技术和安全技术进行定量和定性的评估。主要目的是响应《国家网络安全综合倡议》(CNCI),为美国国家网络安全研究组织测试信息系统的安全提供一个创新的,安全的可控的环境。美《国家网络安全综合倡议》(CNCI)是2008年1月8日由美国布什总统发布的国家安全总政令第54号令/国土安全总统行政令第23号令(密令)提出的,该计划旨在保护美国的网络安全,防止美国遭受各种恶意或敌对的电子攻击,并能对敌方展开网络攻击。2010年3月2日,应美国国内多方呼吁,美国总统奥巴马高调宣布解密其部分内容,我们得以窥见其中部分内容。
时间之外沉浮事
2019/12/03
2.5K0
美国国家政策基金会:美国科技秘密武器来自中国和印度
作者 | 陈彩娴 编辑 | 王晔 近日,美国国家政策基金会 (NFAP) 的一项最新教育数据分析表明:国际学生仍是美国高端科技人才的主要来源;如果没有国际学生,美国的高等科学与工程人才数量将大幅减少,经济发展需求上的人才供给差距也会加大。 该调查给出了重要数据:1)2015年至2019年期间,美国大学就读电气工程专业的全日制国际研究生人数下降了19.5%;2)2016年至2019年期间,美国大学就读计算机与信息科学专业的全日制国际研究生人数下降了 9.5%。 也就是说,这两个数据的下降是发生在新冠疫情大流行
AI科技评论
2023/04/26
2820
美国国家政策基金会:美国科技秘密武器来自中国和印度
AKShare-宏观数据-超灵便型船运价指数
波罗的海航交所是世界第一个也是历史最悠久的航运市场。1744年波罗的海航交所诞生于美国佛吉尼亚波罗的海咖啡屋,目前设在英国伦敦,是世界著名的航运交易所,全球46个国家的656家公司都是波罗的海航交所的会员。为了满足客户的需要,波罗地海航交所于1985年开始发布日运价指数。1999年,国际波罗的海综合运费指数(BDI)取代了BFI,成为代表国际干散货运输市场走势的晴雨表。
数据科学实战
2022/04/18
2740
AKShare-宏观数据-超灵便型船运价指数
PayPal去Exadata的传闻
根据网友爆料: 【Oracle的Exadata又遭弃用】享有“人傻钱多”美誉的Oracle数据库一体机Exadata又捅娄子了,Paypal决定弃用耗费巨资购入的Exadata,因为它十分不稳定,原话是“unreliable”。现在Paypal已开始为采购新设备招标,硬件金额估计高达1千2百万美元。 这几乎是一个令人难以置信的消息,然而还有进一步的内容: HP的牛逼售前团队已经扑进去做技术测试了。数据库仍然还是Oracle,要换掉的是Exadata一体机 要知道HP和Oracle的恩怨可不是一天两天,最早O
数据和云
2018/03/05
1.3K0
靶场发展态势⑧美国家网络空间靶场综合设施(NCRC)
美国陆军计划模拟、培训和仪器执行办公室(PEO STRI)正在寻求市场研究,以协助制定一项为期多年的美国国家网络空间靶场综合设施(NCRC)事件规划和作战支持合同的购置策略,以支持测试资源管理中心(TRMC)的使命--提供比拟真实的网络安全环境,以支持主要国防部(DoD)采购计划的网络安全测试和评估(T&E),并为国防部网络任务部队(CMF)进行比拟真实的培训和认证活动。此市场研究工作与针对支持持续网络培训环境(PCTE)的功能开发和合同等的工作是分开的。目前美国国家网络空间靶场综合设施(NCRC)也和PCTE类似,进入到了合同技术建议书征集阶段。
时间之外沉浮事
2020/01/02
2.6K0
SolarWinds攻击归因成疑,俄罗斯国家黑客or美国内鬼?
距离攻击事件曝光过去了23天。美国网络司令部和国家安全局在外国网络内部放置的用于检测潜在攻击的预警传感器似乎在这次事件中失效了。不到一个月时间,SolarWinds供应链APT攻击事件的受害者名单一再曝出,美、英、俄罗斯各国政府及相关企业纷纷发表声明。
FB客服
2021/01/08
6080
SolarWinds攻击归因成疑,俄罗斯国家黑客or美国内鬼?
美国称俄罗斯国家黑客破坏了国防承包商
自2020年1月以来,俄罗斯支持的黑客一直在瞄准和损害美国已获批准的国防承包商 (CDC),以获取和窃取敏感信息,从而深入了解美国的国防和情报计划和能力。
FB客服
2022/02/25
3490
美国称俄罗斯国家黑客破坏了国防承包商
Sage联盟Salesforce:是羊入虎口 还是自我救赎
很久以来Sage和Salesforce都是CRM市场上的一对老冤家,在今年5月份这两家却宣布联手预准备统治整个CRM市场。通过此次合作,Sage可以在Salesforce 1平台上建立了一套名为Sage Life的全新解决方案,让小企业能够彻底实现在云端运营。 而这决定对于Salesforce和Sage来说都是一次重大的考验。单以Salesforce的角度来说,这是Salesforce增加其影响力的极好方式。对于Sage来说,这代表了一个救赎的机会,多年来在与Salesforce的竞争中,Sage的生存
人称T客
2018/03/21
6320
131. 精读《从 0 到 1》
《从 0 到 1》是一本创业经典,创业非常有魅力,需要多种维度的商业知识,包括基础经济学、公司经济学、商业学、公司金融学、甚至历史学等等。
黄子毅
2022/03/14
5410
131. 精读《从 0 到 1》

相似问题

如何只打印lm的系数?

20

打印rllib模型的模型摘要

15

fastLm()比lm()慢得多

14

滤波lm系数汇总模型

21

用火炬打印Bert模型摘要

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文