首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >更新/替换“`boost::hana::map”中地图值的规范方法

更新/替换“`boost::hana::map”中地图值的规范方法
EN

Stack Overflow用户
提问于 2016-05-23 00:39:20
回答 2查看 1.1K关注 0票数 5

boost::hana::map中更新值(给定键和新值)的规范方法是什么?

我试过使用boost::hana::replace_if,但是它不能在map上工作,因为它不是Functor --我可以通过将map转换为tuple,然后返回到map,但这听起来效率很低。

我目前使用的替代方法是调用map::erase_key,然后调用map::insert

是否有为此目的设计的任何replaceupdate函数可能会丢失?或者这是更新值的“规范”方式吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-23 14:16:41

我不认为目前有一种规范的方法来做到这一点。如果有这方面的有效用例,也许我们可以在其中得到一个函数来支持它。hana::erase_key的问题是,您将创建一个新的映射,然后再使用hana::insert。目前,使用hana::unpack并创建一个新的地图可能是最好的选择。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <boost/hana.hpp>

namespace hana = boost::hana;

template <typename NewPair>
struct replace_helper_t
{
  NewPair const& new_pair;

  template <typename Pair>
  constexpr decltype(auto) operator()(Pair&& p) const
  {
    return hana::if_(
      hana::equal(hana::first(new_pair), hana::first(p)),
      new_pair,
      std::forward<Pair>(p)
    );
  }
};

struct replace_t
{
  template <typename Map, typename NewPair>
  constexpr auto operator()(Map&& m, NewPair&& new_pair) const
  {
    return hana::unpack(std::forward<Map>(m),
      hana::on(
        hana::make_map,
        replace_helper_t<NewPair>{std::forward<NewPair>(new_pair)}
      )
    );
  }
};

constexpr replace_t replace{};

int main()
{
  auto my_map = hana::make_map(
    hana::make_pair(hana::int_c<7>, 7),
    hana::make_pair(hana::int_c<13>, 13),
    hana::make_pair(hana::int_c<23>, 23)
  );

  auto new_map = replace(my_map, hana::make_pair(hana::int_c<13>, 14.0f));

  BOOST_HANA_RUNTIME_ASSERT(new_map ==
    hana::make_map(
      hana::make_pair(hana::int_c<7>, 7),
      hana::make_pair(hana::int_c<13>, 14.0f),
      hana::make_pair(hana::int_c<23>, 23)
    )
  );
}

另外,也许hana::map应该是一个Functor

票数 4
EN

Stack Overflow用户

发布于 2016-05-24 14:28:54

您需要更改值的类型吗?如果没有,如果可以分配值,则可以使用map[key] = new_value或等效的hana::at_key(map, key) = new_value,因为hana::at_key返回引用。

如果您需要更改值的类型,这就更棘手了。我们将无法就地执行任何操作,因为替换值后的映射类型将与替换值之前的类型不同。因此,我们必须创建一个新的映射或该映射的某种修改视图(但是当前不支持视图)。使用erase_keyinsert确实会导致创建两个映射,这是效率低下的。相反,我们可以提供某种实现相同功能的update函数,但是只能创建一个映射副本(结果)。我相信,通过提供我们自己的功能,在编译时间方面,我们也可以比erase_key + insert做得更好。我打开本期来跟踪您的请求,因为我认为提供这样的东西很重要;谢谢。

最后,我想评论一下Jason说的话:

另外,也许hana::map应该是一个函子。

hana::map可以成为函子,但我不确定transform是否能够在仍然尊重函子法则的情况下触摸到地图的键。如果不是这样的话,您仍然不能使用例如hana::replace_if来说“如果键满足某个谓词,就用XXX替换值”。我尝试(但到目前为止)试图找到一个函数的示例,如果hana::transform基本上转换了底层键/值对的序列,那么这些函数就会违反规则,但我的直觉是,找到这样一个例子是可能的。将在第278号问题中继续讨论。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37386345

复制
相关文章
当删库时如何避免跑路
删库跑路也是个老梗了,可见在运维数据库的过程中误删除数据,或者开发的代码有bug,造成数据的误删除屡见不鲜。不过现在也有许多用于恢复或预防误删除的方案,例如SQL管理系统,将要执行的SQL先交由管理员审核,然后由管理员备份一个镜像数据库,在镜像上执行该SQL,并在执行后还原镜像。这样经过层层把关就可以大大减小出现误操作的几率。
端碗吹水
2020/09/23
1K0
当删库时如何避免跑路
SpringBoot同一个服务多个端口启动
设置完端口后点击下 空白处,否则有可能端口设置不上去 如果没有这个选项,则执行以下步骤即可看到:
星辰sea
2022/10/29
1.2K0
SpringBoot同一个服务多个端口启动
1000多个项目中的十大JavaScript错误以及如何避免
通过统计数据库中的1000多个项目,我们发现在 JavaScript 中最常出现的错误有10个。下面会向大家介绍这些错误发生的原因以及如何防止。
一墨编程学习
2018/10/20
6.2K0
1000多个项目中的十大JavaScript错误以及如何避免
通过统计数据库中的1000多个项目,我们发现在 JavaScript 中最常出现的错误有10个。下面会向大家介绍这些错误发生的原因以及如何防止。 对于这些错误发生的次数,我们是通过收集的数据统计得出的
葡萄城控件
2018/03/27
8.4K0
1000多个项目中的十大JavaScript错误以及如何避免
构建知识库时,如何避免最常见的几个错误?
建立知识库并不像单击几个按钮并将其实施到现有网站那么容易。实际上,建立知识库就像建立一个全新的网站,只是它集成到您​​现有的网站中。它是您网站的一个部分,您的客户每次需要有关您的服务的一些信息或有问题需要解决时都会前往该部分。
用户9912463
2022/07/22
6540
使用 React Hooks 时要避免的6个错误
这个组件接收一个参数id,在useEffect中会使用这个id作为参数去请求游戏的信息。并将获取的数据保存在状态变量game中。 ​
玖柒的小窝
2021/11/28
2.4K0
使用 React Hooks 时要避免的6个错误
使用React Hooks 时要避免的5个错误!
最近开源了一个 Vue 组件,还不够完善,欢迎大家来一起完善它,也希望大家能给个 star 支持一下,谢谢各位了。
前端小智@大迁世界
2021/03/11
4.3K0
使用React Hooks 时要避免的5个错误!
服务集成时需避免的两个错误
随着面向服务架构(下文简称 SOA,Service Oriented Architecture)的出现,企业通过将业务功能分解为多重服务 [1],它们迅速地从整体应用程序设计(Monolithic application design)过渡到了异构设计(Heterogeneous design)。在将这些服务集成起来之时,企业架构师应当小心,因为劣质的服务集成将会导致一团乱麻的结局。很多时候,企业假定仅采用如企业服务总线(下文简称 ESB,Enterprise Service Bus)和微服务这样的模式就能避免出现混乱的局面 [2],并且能够提供一个可行的解决方案。当它被 “部分地” 完成时,很不幸这些模式并不能解决某些隐藏的挑战。危险的是,在开发和部署的初始化阶段,它们通常不会被注意到,但是当系统在生产环境中工作时,它们就会出现。等我们意识到后果,为时已晚。本文旨在详细阐述其中的一些挑战,并明确指出,我们可以采取哪些措施来避免这些挑战。
Techeek
2018/06/20
1.4K0
服务集成时需避免的两个错误
学习Java时应避免的10个致命错误
要编码还是不编码?看来您已经选择了第一个选项。编程是专业发展的绝佳领域,它使您有机会参与有趣的项目并在任何需要的地方工作。
可大可小
2020/04/07
5450
如何使用 SSD 避免 VDI 启动风暴
桌面虚拟化,或虚拟桌面基础架构(VDI),可以为IT部门带来诸多好处,包括更简单的系统管理,集中的安全性和数据保护。不过支撑VDI的存储环境需要仔细的规划,以避免VDI启动风暴的问题,即当大量的用户同时登录系统时所造成的系统反应非常缓慢。有许多方法可以解决这个问题,但最有效的方法是将数据巧妙的放置在固态硬盘(SSD)上。
SuperDream
2019/02/28
1.3K0
IL3002:当发布为单个文件时,避免调用
将应用发布为单个文件(例如将项目中的 PublishSingleFile 属性设置为 true)时,调用使用 RequiresAssemblyFilesAttribute 属性注释的成员与单文件不兼容。 这些调用可能不兼容,因为使用此属性注释的成员要求程序集文件位于磁盘上,而嵌入单文件应用的程序集已加载到内存中。
呆呆
2022/02/26
4580
nginx重写url】之 当项目有多个入口文件时
但当我们的php项目有多个入口文件时,(假如有index.php, admin.php, app.php, api.php 四个入口文件),在不处理的状态下,url会呈现出这般景象:
PM吃瓜
2019/08/13
1.8K0
gRPC: 如何在启动多个端口?
为了验证,我们启动了 commonService,commonService 里包含了一系列常用 API,例如 /rk/v1/healthy。
尹东勋
2021/10/20
1.5K0
gRPC: 如何在启动多个端口?
训练机器学习模型时应避免的 6 个错误
对人工智能模型进行训练的同时,还需要进行多阶段任务,以充分利用训练数据,获得满意的结果。为了保证人工智能模型的性能,本文列出了六个需要避免的常见错误。
深度学习与Python
2021/06/08
9430
如何避免数据科学领域的新手错误?
原标题 | How to avoid rookie mistakes in the field of Data Science作 者 | Pritha Saha 翻 译 | CONFIDANT(福建师范大学) 编 辑 | Pita 我最近开始通过自学成为数据科学家的旅程,这条路并不总是一帆风顺的,因为没有人给我详细而有序的教学大纲。我尝试做了几件事,都没有很成功,但后来又有所收获。如果您是一位有抱负的数据科学家,本文可能会帮助您避免犯我曾经所犯的错误。 首先,永远不要试图通过死记硬背学习机器学习算法,大脑只
AI研习社
2019/08/09
7660
如何避免数据科学领域的新手错误?
windows如何安装多个版本mysql,如何同时启动
ini文件里面 端口也要改为不一样,比如改为3307 以管理员身份打开cmd命令窗口,将目录切换到MySQL的安装目录的bin目录下 进入mysql的bin目录后执行
一写代码就开心
2022/06/12
4K1
windows如何安装多个版本mysql,如何同时启动
开始使用Vue 3时应避免的10个错误
Vue 3 稳定已经有一段时间了。许多代码库正在生产中使用它,其他人最终也必须进行迁移。我有机会与它一起工作,并记录了我的错误,这可能是你想避免的。
前端小智@大迁世界
2023/07/09
3020
开始使用Vue 3时应避免的10个错误
点击加载更多

相似问题

Numpy点积

11

numpy点积和矩阵积

27

Numpy点积问题

32

Numpy数组点积

224

Numpy元素点积

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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