c++ - contiguous_range 是否总是 sized_range?
问题描述
关于 C++20 中的范围库,我有以下问题:
让std::ranges::contiguous_range<T>
任意类型T。
我可以假设std::ranges::sized_range<T>
吗?
解决方案
不,不是每个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::string
objects
和一些 predicate p
,要么:
s | std::views::take_while(p)
s | std::views::drop_while(p)
这里的结果范围仍然是连续的,但我们不知道它在哪里结束(在第一种情况下)或从哪里开始(在第二种情况下),所以我们不知道它的大小。
推荐阅读
- dask - dask.distributed SLURM 集群 Nanny Timeout
- php - 警告:array_filter() 期望参数 1 是数组
- npm - watch 触发重新编译后 index.html 消失
- json - JsonValidationError 不是对象错误解释
- python-3.x - 你如何调整条形图上的间距和它的 xtick 标签?
- azure - 如何在 Azure PowerShell 中获取所有资源参数详细信息
- php - PHP从带有href链接和标签的mysql DB获取结果
- html - 在Angular中打印所选行的行号
- node.js - 如何让 node.js body-parser 抱怨有效负载太大
- azure - 覆盖 Chrome 对具有空白相同站点属性的 cookie 的新行为