【问题标题】:Best way to return a transform iterator range返回变换迭代器范围的最佳方法
【发布时间】:2014-02-16 21:11:02
【问题描述】:

假设我想编写一个简单的函数keys,它接受std::map 并返回一个提供地图键的iterator_range。我该怎么做?

template<typename A, typename B>
Range<A> keys(const std::map<A, B> & m) { ??? }

我想将相同的模式应用于其他各种容器,但我认为这是一个很好的原型示例。

编辑:我猜我需要 Boost 的 range_adapters 和/或 transform_iterators 领域的东西,但我对它们不够熟悉,无法在这里应用它们。

【问题讨论】:

  • 你说的是boost's iterator_range吗?
  • 是的,但我不喜欢它。
  • ....类似于boost::adaptors::keys 函数?
  • @dyp:生活中最美好的事情已经完成。 ;) 谢谢。我将不得不查看实现,看看这是否有助于我在其他地方重复这种模式。
  • @3noch - 你找到解决方案了吗?如果是,请回答您自己的问题,以便社区学习

标签: c++ map iterator iterator-range


【解决方案1】:

boost::adapters::keys 满足了这一特殊需求。更一般地说,boost::range 允许您设计自己的适配器,但它有点涉及。因此,除非您正在设计一个新库,否则您也许可以使用transformed

如果您需要将范围的结果返回到容器中,您可以编写一个简单的 collect 函数,该函数将“收集”boost::range 管道的结果。

template<typename Output, typename SinglePassRange>
Output collect(const SinglePassRange & rng)
{
    Output r;
    boost::range::copy(rng, std::inserter(r, boost::begin(r)));
    return r;
}

现在您可以轻松地创建一些小功能并

  • collect&lt;vector&lt;int&gt;&gt;(numbers | filtered(odd))
  • collect&lt;vector&lt;int&gt;&gt;(numbers | transformed(doubled))
  • collect&lt;vector&lt;K&gt;&gt;(myMap | transformed(keyOf))

【讨论】:

    猜你喜欢
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2021-12-26
    • 2012-05-21
    • 2013-02-01
    • 2012-03-11
    相关资源
    最近更新 更多