【问题标题】:Why are C++ 20 range algorithms in <algorithm> and views in <ranges>?为什么 <algorithm> 中有 C++ 20 范围算法,<ranges> 中有视图?
【发布时间】:2021-11-11 17:30:20
【问题描述】:

我承认这是对命名的吹毛求疵,但除了我对命名的吹毛求疵之外,我还有一些现实生活中的代码审查经验,我看到人们在他们只需要 &lt;algorithm&gt; 时包含 &lt;ranges&gt;,例如使用std::ranges::count_if时。

那么为什么要将范围算法放在&lt;algorithm&gt; 中,而将视图放在&lt;ranges&gt; 中呢? 这对我来说更有意义:

  • 将范围算法放入&lt;algorithm&gt;并将&lt;ranges&gt;重命名为&lt;views&gt;/&lt;range_views&gt;
  • 将范围算法和视图都放入&lt;ranges&gt;

注意:我知道我过度简化了标题之间的区别,&lt;ranges&gt; 也包含很多 concepts and building blocks,所以这可能是理由的一部分。

【问题讨论】:

  • 你的问题没有意义。视图不是算法,那么为什么它们应该在算法标题中呢?范围算法算法,那么为什么不应该在算法标题中呢?
  • @NicolBolas 我想我从来没有说过将视图放在算法标题中,可能是我输入了错误但重读时我找不到它......

标签: c++ c++20


【解决方案1】:

我不是提案的作者,所以我不能规范地回答为什么做出选择。充其量,我可以提出选择合理的理由。

One Ranges 提案 P0896R4 似乎没有选择的理由。 Range Adapters and Utilities P0789R3 没有这些算法。

那么为什么要把范围算法放在&lt;algorithm&gt;

线索就在名字里:)它们是算法,算法可以在这个标题中找到。

如果有人在寻找find_if,他们可以在同一个地方找到迭代器算法和范围算法。

那么为什么要将范围 [...] 视图放在 &lt;ranges&gt; 中?

过去在任何现有标题中都没有视图,因此使用现有标题可能不合适。因此引入了一个新的标头。

视图子集有一个类似物,即范围适配器视图。有(并且仍然有)迭代器适配器。这些在&lt;iterator&gt; 中定义。我认为那不是放置范围适配器的好地方。

将范围算法放入&lt;algorithm&gt;并重命名为&lt;views&gt;/&lt;range_views&gt;

&lt;ranges&gt; 不仅仅包含视图。它包含诸如ranges::range 之类的概念、诸如ranges::sentinel_t 之类的范围原始类、诸如ranges::borrowed_iterator_t 之类的特定于范围的迭代器、类似于std::ranges::begin 之类的迭代器工具的函数。将标题命名为 &lt;views&gt; 可能会产生误导。

将范围算法和视图都放入&lt;ranges&gt;

也许如果迭代器算法最初被放置在&lt;iterator&gt; 中,那么范围算法将被放置在&lt;ranges&gt; 中以遵循该约定。但实际上,之前的约定是将算法拆分为一个单独的标头,并且遵循该约定与范围。

【讨论】:

    猜你喜欢
    • 2021-01-04
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2021-09-29
    • 2020-04-02
    • 1970-01-01
    相关资源
    最近更新 更多