C++ C++;20:左半程或右半程有子范围吗?

C++ C++;20:左半程或右半程有子范围吗?,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()); //

以下是我试图编写的代码:

#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 << ' ';
    }
    
}
#包括
#包括
#包括
#包括
int main(){
std::向量v{1,2,3,4};
std::载体u(4);
std::ranges::copy(v,u.begin());//确定
//std::ranges::copy(v+2,u.begin());//失败
用于(自动n:u){

std::cout您可以分别使用或获取范围的左侧或右侧:

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());
这是一个例子


通常,您还可以使用,它允许您从迭代器和sentinel值创建子范围:

std::ranges::copy(std::ranges::subrange(v.begin() + 2, v.end()), 
                  u.begin()); 

下面是一个。

您可以分别使用或获取范围的左侧或右侧:

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());
这是一个例子


通常,您还可以使用,它允许您从迭代器和sentinel值创建子范围:

std::ranges::copy(std::ranges::subrange(v.begin() + 2, v.end()), 
                  u.begin()); 

这是一个。

目前还没有标准版本

自我回答:

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

template <std::ranges::random_access_range R>
auto left_half(R r) {
    return std::ranges::subrange(std::begin(r), std::begin(r) + std::ranges::size(r) / 2);
}

template <std::ranges::random_access_range R>
auto right_half(R r) {
    return std::ranges::subrange(std::begin(r) + std::ranges::size(r) / 2, std::end(r));
}

int main() {
    std::vector<int> v {1, 2, 3, 4};
    std::vector<int> u (4);
    
    std::ranges::copy(left_half(v), u.begin());
    
    for (auto n : u) {
        std::cout << n << ' ';
    }
    
}

#include

目前还没有标准版本

自我回答:

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

template <std::ranges::random_access_range R>
auto left_half(R r) {
    return std::ranges::subrange(std::begin(r), std::begin(r) + std::ranges::size(r) / 2);
}

template <std::ranges::random_access_range R>
auto right_half(R r) {
    return std::ranges::subrange(std::begin(r) + std::ranges::size(r) / 2, std::end(r));
}

int main() {
    std::vector<int> v {1, 2, 3, 4};
    std::vector<int> u (4);
    
    std::ranges::copy(left_half(v), u.begin());
    
    for (auto n : u) {
        std::cout << n << ' ';
    }
    
}

#include

这是很多代码。你能做一个吗?应该只有几行来演示问题。还要添加编译器错误。@cigien-Sure,added。编译器错误就像是200多行博士论文一样,总是与模板相关的错误。这是很多代码。你能做一个吗?应该只有几行来演示问题。还要添加编译器错误。@cigien-Sure,added。编译器错误就像是200多行博士论文一样,与模板相关的错误总是会给出。这比算法的原始版本要详细得多。不过还是要谢谢你。我将试着定义自己的模板函数来完成这项工作。好的,可能会有更简洁的方法,但我不确定。另外,您肯定应该添加名称空间别名,以使代码更具可读性。@frozenca添加了一个我认为您会喜欢的版本:)这比算法的原始版本要详细得多。但无论如何,谢谢。我将尝试定义自己的模板函数来完成这项工作。好的,可能有更简洁的方法,但我不确定。另外,您应该e直接添加名称空间别名以使代码更具可读性。@frozenca添加了一个我认为您会喜欢的版本:)