C++20管道運(yùn)算符的實(shí)現(xiàn)示例
我們不打算介紹太多,因?yàn)樗鼘?shí)際屬于c++20最為重要的一個(gè)特性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,只是返回一個(gè)序列
for (auto i : ret) {
std::cout << i << ' ';
}
}管道運(yùn)算符調(diào)用的函數(shù)并不會(huì)改變?cè)瓉淼男蛄?,這一點(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) 范圍適配器對(duì)象。對(duì)于任何適合的子表達(dá)式 e 表達(dá)式 views::join(e) 表達(dá)式等價(jià)于 join_view<views::all_t<decltype((e))>>{e}
自己實(shí)現(xiàn)類似的管道運(yùn)算符
其實(shí)我們只要實(shí)現(xiàn)一個(gè)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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ 開發(fā)之實(shí)現(xiàn)操作符重載的實(shí)例
這篇文章主要介紹了C++ 開發(fā)之實(shí)現(xiàn)操作符重載的實(shí)例的相關(guān)資料,這里附有實(shí)例代碼和實(shí)現(xiàn)效果圖幫助大家參考實(shí)踐,需要的朋友可以參考下2017-07-07
C++實(shí)現(xiàn)LeetCode(309.買股票的最佳時(shí)間含冷凍期)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(309.買股票的最佳時(shí)間含冷凍期),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
C++使用ImGUI框架開發(fā)一個(gè)簡(jiǎn)單程序
ImGui?是一個(gè)用于C++的用戶界面庫,跨平臺(tái)、無依賴,支持OpenGL、DirectX等多種渲染API,下面就跟隨小編一起學(xué)習(xí)一下如何使用ImGUI框架開發(fā)一個(gè)簡(jiǎn)單程序吧2023-08-08
C++類中三大函數(shù)詳解(構(gòu)造、析構(gòu)和拷貝)
c++三大函數(shù)指的是拷貝構(gòu)造、拷貝賦值、析構(gòu)函數(shù),下面這篇文章主要給大家介紹了關(guān)于C++類中三大函數(shù)(構(gòu)造、析構(gòu)和拷貝)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
C語言超詳細(xì)講解隊(duì)列的實(shí)現(xiàn)及代碼
隊(duì)列(Queue)與棧一樣,是一種線性存儲(chǔ)結(jié)構(gòu),它具有如下特點(diǎn):隊(duì)列中的數(shù)據(jù)元素遵循“先進(jìn)先出”(First?In?First?Out)的原則,簡(jiǎn)稱FIFO結(jié)構(gòu)。在隊(duì)尾添加元素,在隊(duì)頭刪除元素2022-04-04

