c++ - C++ 20:左半部分或右半部分是否有子范围?

标签 c++ c++20

这是我要编写的代码:

#include <algorithm>
#include <ranges>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> v {1, 2, 3, 4};
    std::vector<int> u (4);
    
    std::ranges::copy(v, u.begin()); // OK
    // std::ranges::copy(v + 2, u.begin()); // FAIL
    
    for (auto n : u) {
        std::cout << n << ' ';
    }
    
}
问题是-如何从起始迭代器创建子范围并将其传递给范围受约束的STL算法?

最佳答案

您可以分别通过使用 views::take views::drop 来获得范围的左侧或右侧:

std::ranges::copy(v | std::ranges::views::take(2), // left side
                  u.begin());

std::ranges::copy(v | std::ranges::views::drop(2), // right side
                  u.begin());
这是demo

通常,您还可以使用std::ranges::subrange,它使您可以从迭代器和哨兵值创建子范围:
std::ranges::copy(std::ranges::subrange(v.begin() + 2, v.end()), 
                  u.begin()); 
这是demo

关于c++ - C++ 20:左半部分或右半部分是否有子范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63523624/

相关文章:

c++ - 为什么下面的代码使用 clang 而不是 gcc 编译

c++ - 我不明白 Rcpp 中的这种行为

c++ - 使用放置/分段语法是否可以实现惰性 "operator or"重载?

c++ - 如何在概念中使用 C++ requires 子句来要求成员变量满足概念约束?

C++20 显式默认相等运算符

c++ - 使用指针作为返回类型实现模板化接口(interface)的函数 -> 冲突返回类型错误

C++ 在美国日期的 COleDateTime 中 LCID 的正确用法是什么

c++ - 用单个字符初始化字符串

c++ - 概念包含适用于函数,但不适用于结构

c++ - 为什么 `constexpr` 函数在编译时和运行时会产生不同的结果?