[英]Do C++20 ranges have value(not predicate) version of filter or any_of?
[英]Does c++20 ranges have any view functions that do not return value?
我可以使用 std::views::transform 創建新stream-style
容器,然后打印它,如下所示:
#include<iostream>
#include<vector>
#include<ranges>
using namespace std;
int main() {
// clang -std=c++20
std::vector<int> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
auto output = input
| std::views::filter([](const int n) {return n % 3 == 0; })
| std::views::transform([](const int n) {return n * n; });
for (auto o : output) {
cout << o << endl;
}
return 0;
}
是的,它可以工作,但我希望簡單地將我for
循環寫入由|
連接的管道中。 ,有沒有辦法將代碼更改為:
input
| std::views::filter([](const int n) {return n % 3 == 0; })
| std::views::transform([](const int n) {return n * n; })
| std::views::SOME_FUNCTION(cout<<n<<endl);
這避免了我for
循環。
所以我的問題是: std::views
是否有 SOME_FUNCTION 可以滿足我的需求?
您正在尋找的不是視圖。 其實我不完全確定你在找什么,但也許它是std::ranges::for_each
:
#include<iostream>
#include<vector>
#include<ranges>
#include <algorithm>
using namespace std;
int main() {
// clang -std=c++20
std::vector<int> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
std::ranges::for_each(input
| std::views::filter([](const int n) {return n % 3 == 0; })
| std::views::transform([](const int n) {return n * n; }),
[](auto x){std::cout << x << endl;});
}
C++20(或 C++23)中沒有這樣的適配器。 我還發現這個特性缺失了,因為它可以讓程序員轉向更一致和更“純粹”的函數式風格,而不是通過管道 ( |
) 組合表達式,然后在循環中使用它。
最終,我希望std::views::for_each
(或者可能是std::actions::for_each
,如果actions
符合標准)可以做到這一點。 截至目前,您可以實現自己的可管道的for_each
,但不幸的是,這不會像人們希望的那樣標准。
因此,目前最安全的做法是堅持基於范圍的for
循環或std::ranges::for_each
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.