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

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

Stack Overflow用户
提问于 2016-05-23 08: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 22:16:41

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

代码语言:javascript
代码运行次数:0
运行
复制
#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 22: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

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档