C++20管道運(yùn)算符的實(shí)現(xiàn)示例
我們不打算介紹太多,因為它實(shí)際屬于c++20最為重要的一個特性ranges的一部分
我們講解一下使用和自己實(shí)現(xiàn)的例子即可
標(biāo)準(zhǔn)庫的管道運(yùn)算符使用
#include <ranges>
#include <iostream>
int main()
{
auto const ints = { 0,1,2,3,4,5 };
auto even = [](int i) { return 0 == i % 2; };
auto square = [](int i) { return i * i; };
// 組合視圖的“管道”語法:
for (int i : ints | std::views::filter(even) | std::views::transform(square)) {
std::cout << i << ' ';
}
std::cout << '\n';
// 傳統(tǒng)的“函數(shù)式”組合語法,filter是篩選,然后再用transform篩選
for (int i : std::views::transform(std::views::filter(ints, even), square)) {
std::cout << i << ' ';
}
endl(std::cout);
auto f = std::views::transform([](int n) { return n *= n; });
auto ret = ints | f;//并沒有改變ints,只是返回一個序列
for (auto i : ret) {
std::cout << i << ' ';
}
}管道運(yùn)算符調(diào)用的函數(shù)并不會改變原來的序列,這一點(diǎn)需要注意。雖然管道運(yùn)算符相比傳統(tǒng)的函數(shù)式看著要更加抽象,但是其實(shí)如果你真正的去使用了解,倒也是挺優(yōu)雅的
#include <iostream>
#include <ranges>
#include <string_view>
#include <vector>
#include<algorithm>
#include <numeric>
int main()
{
using namespace std::literals;
const auto bits = { "https:"sv, "http://"sv, "cppreference"sv, "."sv, "com"sv };
for (char const c : bits | std::views::join) std::cout << c;
std::cout << '\n';
const std::vector<std::vector<int>> v{ {1,2}, {3,4,5}, {6}, {7,8,9} };
auto jv = std::ranges::join_view(v);
for (auto const e : jv) std::cout << e << ' ';
std::cout << '\n';
int array[5][5]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 };
for (int c : array | std::views::join)std::cout << c<<' ';
std::cout << '\n';
//默認(rèn)只能處理兩層,如果多層,那么就多join幾次
int array2[2][2][2]{ 1,2,3,4,5,6,7,8 };
for (int c : std::ranges::join_view(array2) | std::views::join)std::cout << c << ' ';
std::cout << '\n';
}
1) 表示由從拉平范圍的視圖獲得的序列組成的 view 。
2) 范圍適配器對象。對于任何適合的子表達(dá)式 e 表達(dá)式 views::join(e) 表達(dá)式等價于 join_view<views::all_t<decltype((e))>>{e}
自己實(shí)現(xiàn)類似的管道運(yùn)算符
其實(shí)我們只要實(shí)現(xiàn)一個operator |即可
template<typename U, typename F>
requires std::regular_invocable<F, U&>
std::vector<U>& operator | (std::vector<U>& vl, F f) {
for (auto& i : vl) {
f(i);
}
return vl;
}第二行代碼是標(biāo)準(zhǔn)庫的概念庫,要求F是可調(diào)用,U的類型也符合
最后返回引用則是為了鏈?zhǔn)骄幊?/p>
使用如下:
int main() {
std::vector v{ 1,2,3,4,5 };
std::function f([](int& i) { i = i * i; });
std::function f2([](int& i) {i = i + i; });
std::function f3([](int i) {std::cout << i << ' '; });
v | f | f2 | f3;
std::cout << '\n';
v | [](int& i) { i = i * i; } | [](int i) {std::cout << i << ' '; };
std::cout << '\n';
for (auto i : v | [](int& i) {i = i / 10; }) {
std::cout << i << ' ';
}
}
多使用即可
到此這篇關(guān)于C++20管道運(yùn)算符的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)C++20管道運(yùn)算符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++特殊類設(shè)計與類型轉(zhuǎn)換詳細(xì)代碼示例
在C++編程語言中,類類型轉(zhuǎn)換操作符是一種特殊的功能,允許我們把一個類的對象轉(zhuǎn)換為其他類型,如內(nèi)置類型、類類型或者由類型別名定義的類型,這篇文章主要介紹了C++特殊類設(shè)計與類型轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下2026-01-01
C++數(shù)據(jù)結(jié)構(gòu)二叉搜索樹的實(shí)現(xiàn)應(yīng)用與分析
從這篇博客開始,我就要和大家介紹有關(guān)二叉搜索樹的知識,它還衍生出了兩棵樹——AVL樹和紅黑樹,在后面兩篇博客我都會介紹。今天先從二叉搜索樹開始引入2022-02-02
C語言使用scanf連續(xù)輸入字符串出現(xiàn)的問題
這篇文章主要介紹了C語言使用scanf連續(xù)輸入字符串出現(xiàn)的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12

