【问题标题】:Iterating over first n elements of a container - std::span vs views::take vs ranges::subrange迭代容器的前 n 个元素 - std::span vs views::take vs range::subrange
【发布时间】:2022-01-20 00:33:21
【问题描述】:

因此,在 c++ 20 中,我们获得了许多具有范围、跨度等的新特性。现在,如果我需要迭代一个容器,但只有第一个 n 元素,那么最合适的方法是什么,幕后有什么实际区别吗?还是返回到带有索引的常规 for 循环可能是一个更好的主意,因为这些示例的性能可能较差?

for (const auto &e: elements | std::ranges::views::take(n)) {
// do stuff
}

for (const auto &e: std::span(elements.begin(), n)) {
// do stuff
}

for (const auto &e: std::ranges::subrange(elements.begin(), elements.begin() + n)) {
// do stuff
}

【问题讨论】:

    标签: c++ c++20 std-ranges


    【解决方案1】:
    • views::take 是最通用的,它几乎适用于任何范围,例如input_rangeoutput_range,以及更精细的范围。

    • std::span 适用于contiguous_range

    • 虽然ranges::subrange也是泛型的,但是由于需要通过elements.begin() + n获取迭代器的边界,这就要求elements必须是random_access_range

    另外值得注意的是P1739之后,views::take会根据范围的类型得到一个“合适”的范围类型,即当范围为span时,会返回spanstring_view时返回string_viewsubrange时返回subrangeiota_view时返回iota_view

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 2017-01-19
      • 1970-01-01
      • 2019-10-15
      相关资源
      最近更新 更多