【问题标题】:Is there a class to store a generic range in std::ranges?是否有一个类可以在 std::ranges 中存储通用范围?
【发布时间】:2021-10-10 03:16:54
【问题描述】:

是否有一个具体的模板类(不是概念)来在 std Ranges 中存储一个通用范围(即一对迭代器/哨兵)?

给定一对迭代器,我始终可以将其存储在 std::pair<iterator_type, interator_type> 中,并以 .first.second 的形式访问它们,但实际上它们可以命名为 .begin().end()

我发现了这个非常古老的提议,http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3350.html#index_1overview

原因是我的函数需要一对迭代器(就像过去一样)并且应该返回它们的 (const) 视图,所以我似乎需要返回一个具体的类型。

template<class It>
a_range<It> my_func(It first, It last){
   ...
   return a_range<It>(first, last);
}

我在 Range 库中没有找到任何内容。 我能找到的最接近的是https://en.cppreference.com/w/cpp/ranges/view_interface

template<class It>
auto my_func(It first, It last){
   ...
   struct View : public std::ranges::view_interface<View> {
     View(It begin, It end) : m_begin(begin), m_end(){}
     auto begin() const { return m_begin; }
     auto end() const { return m_end; }
   private:
     It m_begin, m_end;
   };
   return View{first, last};
}

或者,更重要的是:

   ...
   return  std::ranges::transform_view{ View{first, last}, [](auto const& a)->decltype(a){return a;});
}

这是朝着正确的方向发展吗?

首先,我想保留访问类别(例如随机访问等),这似乎没有保留。 还使用transform 来保护(作为 const)元素似乎有点矫枉过正,但这是次要的。

【问题讨论】:

    标签: c++ iterator transform std-ranges


    【解决方案1】:

    我认为您要求的是可以从一对迭代器(或更一般地说,迭代器和哨兵)创建的范围。 std::ranges::subrange 就是这样做的。它继承自您提到的view_interface

    【讨论】:

    • 不错。有趣的名称不一定是适当的子范围。好像是这样,让我试试。只有在 C++ 中范围是一个概念,而子范围是一个具体的(虽然是模板)类型。
    • @alfC 这就是为什么它没有命名为proper_subrange :)
    猜你喜欢
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 2011-11-03
    • 2018-04-21
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多