C++中的Java流克隆

owfi6suc  于 2023-03-25  发布在  Java
关注(0)|答案(1)|浏览(154)

Java 8中的流在C++中是否也有类似的东西?例如,在Java中,您可以像这样使用流来迭代集合:

int arr[] = { 1, 2, 3 };
Arrays.stream(arr); // this returns a stream

// on these streams you can apply some functions like the filter function:

int evenArray[] = Arrays.stream(arr).filter(a -> { return a % 2 == 0; }).toArray();

// the result of filter is another stream. You can also collect to a new array after

那么,在C中有这样的东西吗?我真的很喜欢Java的这个特性,我找到的只是一篇解释的文章,没有。我希望,C可能得到了我错过的更新。

zqdjd7g9

zqdjd7g91#

正如@NathanOliver所指出的,C++20范围来拯救。如果你想首先过滤std::vector<int>,然后将每个元素乘以2,你可以写:

#include <ranges>                                                                                                                                                                                                                      
#include <algorithm>                                                                                                                                                                                                                   
#include <vector>                                                                                                                                                                                                                      
#include <iostream>                                                                                                                                                                                                                    
                                                                                                                                                                                                                                       
namespace vi = std::ranges::views;                                                                                                                                                                                                     
namespace rn = std::ranges;                                                                                                                                                                                                            
                                                                                                                                                                                                                                       
int main()                                                                                                                                                                                                                             
{                                                                                                                                                                                                                                      
        std::vector<int> vec = { 2, 3, 1, 8, 5, 4, 6 };                                                                                                                                                                                
        auto result = vec | vi::filter([](int i) { return i % 2 == 0; })                                                                                                                                                             
                          | vi::transform([](int i) { return i * 2; });                                                                                                                                          
                       // | rn::to<std::vector> // would collect to vector, but is C++23
        for (auto r : result)
                std::cout << r << " "; // output: 4 16 8 12                                       
        std::cout << std::endl;                                                                                                                                                                                                         
}

然而,输出是一个范围,而不是一个向量。据我所知,在C20中没有标准的方法将其转换回向量,但是在C23中添加了std::ranges::to。在此之前,您需要一个解决方案。

相关问题