首页 > 解决方案 > contiguous_range 是否总是 sized_range?

问题描述

关于 C++20 中的范围库,我有以下问题:

std::ranges::contiguous_range<T>任意类型T。

我可以假设std::ranges::sized_range<T>吗?

标签: c++stliteratorlanguage-lawyerc++20

解决方案


不,不是每个contiguous_range都是sized_range.

最简单的例子是以空字符结尾的字符串。它是连续的,但我们无法及时知道它的大小O(1)。我们可以很容易地使用哨兵来表示这样的事情:

struct ntbs_sentinel {
    bool operator==(char const* p) const {
        return *p == '\0';
    }
};

struct ntbs {
    char const* p;
    char const* begin() const { return p; }
    ntbs_sentinel end() const { return {}; }
};

static_assert(std::ranges::contiguous_range<ntbs>);
static_assert(!std::ranges::sized_range<ntbs>);

另一个例子是,给定一些std::stringobjects和一些 predicate p,要么:

  • s | std::views::take_while(p)
  • s | std::views::drop_while(p)

这里的结果范围仍然是连续的,但我们不知道它在哪里结束(在第一种情况下)或从哪里开始(在第二种情况下),所以我们不知道它的大小。


推荐阅读