自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一個(gè)代碼示例讓你看懂 C++20 Ranges 的驚人魔力

開發(fā)
Ranges 庫(kù)就像是給老舊的迭代器穿上了一件時(shí)尚外套,讓數(shù)據(jù)處理變得前所未有的優(yōu)雅!

親愛的程序員朋友們!還在為那些又臭又長(zhǎng)的迭代器語(yǔ)法抓耳撓腮嗎??? 別擔(dān)心,C++20給我們帶來(lái)了一件超級(jí)英雄裝備 - Ranges庫(kù)!它就像是給老舊的迭代器穿上了一件時(shí)尚外套,讓數(shù)據(jù)處理變得前所未有的優(yōu)雅!?

想象一下,你有一個(gè)神奇的百寶箱(也就是我們的容器)??,里面裝滿了各種各樣的數(shù)據(jù)。在過去,要處理這些數(shù)據(jù),你可能需要寫一堆讓人頭大的迭代器代碼 ??。但現(xiàn)在有了Ranges,一切都變得像魔法一樣簡(jiǎn)單!??

來(lái)看看這個(gè)讓人眼前一亮的例子 ??:

#include <iostream>
#include <ranges>
#include <vector>
#include <string>

int main() {
    // 假設(shè)這是我們的購(gòu)物清單和價(jià)格 ??
    std::vector<int> prices = {42, 13, 27, 89, 100, 25, 15};
    
    // 我們想找出所有超過20塊的商品,并給它們打個(gè)超值八折!??
    auto expensive_items = prices 
        | std::views::filter([](int price) { return price > 20; })
        | std::views::transform([](int price) { return price * 0.8; });
    
    std::cout << "雙11特惠價(jià)格: ";  // 改成更有趣的輸出文本
    for (double price : expensive_items) {
        std::cout << price << "?? ";
    }
    // 輸出: 33.6?? 21.6?? 71.2?? 80?? 20??
}

看到了嗎?這代碼優(yōu)雅得就像在寫詩(shī)一樣!?? 使用管道符號(hào) | 把各種操作串在一起,就像在玩樂高積木一樣有趣!??

讓我們?cè)賮?lái)看個(gè)更有趣的例子,這次我們要打造一個(gè)超級(jí)馬里奧世界 ??:

#include <iostream>
#include <ranges>
#include <vector>
#include <string>

int main() {
    // 召集我們的游戲英雄們!??♂?
    std::vector<std::string> players = {
        "Mario", "Luigi", "Peach", "Bowser", "Yoshi"
    };
    
    // 給厲害的角色們升級(jí),變身超級(jí)英雄!?
    auto super_players = players
        | std::views::filter([](const std::string& name) { return name.length() > 4; })
        | std::views::transform([](const std::string& name) { return "Super " + name; });
    
    std::cout << "? 超級(jí)英雄登場(chǎng) ?\n";
    for (const auto& name : super_players) {
        std::cout << "?? " << name << " 華麗登場(chǎng)!\n";
    }
    // 輸出:
    // ?? Super Luigi 華麗登場(chǎng)!
    // ?? Super Bowser 華麗登場(chǎng)!
}

Ranges庫(kù)不僅讓代碼變得清爽可愛,還自帶防護(hù)罩 ???,幫你避開各種討厭的bug。它就像是你的私人保鏢,讓你可以放心大膽地寫代碼,再也不用擔(dān)心那些煩人的越界問題啦!??

最神奇的是,Ranges還是個(gè)"懶惰"的小可愛 ?? - 它不會(huì)著急忙慌地處理所有數(shù)據(jù),而是等到真正需要的時(shí)候才開始工作。就像點(diǎn)外賣一樣,下單之后廚師會(huì)等到外賣小哥來(lái)了才開始烹飪,既新鮮又高效!??

?? 小彩蛋:Ranges庫(kù)里還藏著很多好玩的功能等你來(lái)發(fā)現(xiàn)呢!比如views::zip可以把兩個(gè)序列像拉拉鏈一樣組合在一起 ??,views::enumerate則能給每個(gè)元素自動(dòng)編號(hào),就像給小朋友們排隊(duì)一樣!??

記住哦,優(yōu)秀的代碼不僅要能跑起來(lái),還要能講出一個(gè)精彩的故事。有了Ranges庫(kù)這個(gè)魔法棒,你的代碼也能變成一個(gè)充滿魔力的童話!? 讓我們一起用Ranges來(lái)創(chuàng)造編程的藝術(shù)吧!??

Ranges 庫(kù)的魔法世界 ??

想象一下,Ranges 庫(kù)就像是一個(gè)神奇的百寶箱 ??,它不僅讓我們告別了那些繁瑣的迭代器代碼,還給我們帶來(lái)了一個(gè)全新的魔法世界!它就像是給迭代器和算法穿上了一件魔法斗篷,讓它們變得更強(qiáng)大,更不容易犯錯(cuò) ?

在這個(gè)魔法世界里,Range 就像是一個(gè)百變小精靈 ??♀?,它可以變成各種各樣的形態(tài):有時(shí)候它是一對(duì)可愛的迭代器小情侶 [begin, end),手牽手漫步在容器世界里;有時(shí)候它是個(gè)計(jì)數(shù)小能手 begin + [0, size),就像 views::counted 那樣一步一步數(shù)著前進(jìn);有時(shí)候它還會(huì)變成一個(gè)帶著任務(wù)的小偵探 [begin, predicate),像 views::take_while 那樣一直探索直到找到特定的線索;甚至有時(shí)候它化身無(wú)限冒險(xiǎn)家 [begin, ..),像 views::iota 那樣勇往直前,永不停歇!??

這個(gè)魔法世界里有兩種神奇的魔法:一種是即時(shí)魔法(Range 算法)??,念咒語(yǔ)后立刻見效;另一種是慵懶魔法(Range 適配器)??,它會(huì)等到真正需要的時(shí)候才慢悠悠地發(fā)揮作用。就像是點(diǎn)外賣,一個(gè)是現(xiàn)成的快餐,另一個(gè)是等你真餓了才開始烹飪的私房菜!

而視圖(Views)就像是魔法世界里的輕功高手 ??,動(dòng)作輕盈(輕量級(jí)),來(lái)去自如(常數(shù)時(shí)間復(fù)制/移動(dòng)),還能和其他高手配合使用管道魔法,組成威力強(qiáng)大的組合技!就像這樣:

std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

// 來(lái)看看這個(gè)神奇的魔法組合吧!?
auto magic_numbers = numbers 
    | std::views::filter([](int n) { return n % 2 == 0; })  // 篩選出偶數(shù)小精靈 ??
    | std::views::transform([](int n) { return n * n; });   // 讓它們變得更強(qiáng)大!??

// 看看我們的魔法成果吧!
for (int n : magic_numbers) {
    std::cout << n << " ? ";  // 輸出:4 16 36 64 100 ?
}

看!這就是 Ranges 的魔法世界 ??,它讓我們的代碼不僅功能強(qiáng)大,還變得像講故事一樣有趣!讓我們一起在這個(gè)充滿魔法的世界里探索吧!??

更多魔法組合技!?

朋友們,想不想學(xué)習(xí)一些更厲害的 Ranges 魔法組合技呢??? 讓我們一起來(lái)看看這些令人眼前一亮的高級(jí)用法吧!

#include <iostream>
#include <ranges>
#include <vector>

int main() {
    // 召喚一隊(duì)數(shù)字小精靈!??
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
    // 來(lái)點(diǎn)魔法!讓我們從這隊(duì)小精靈中挑選一些特別的成員 ?
    auto middle_numbers = numbers 
        | std::views::drop(2)      // 讓前面兩個(gè)小精靈休息一下~ ??
        | std::views::take(4);     // 只邀請(qǐng)接下來(lái)的四個(gè)小精靈來(lái)玩!??
    
    // 讓小精靈們手牽手,兩個(gè)一組排好隊(duì) ??
    auto number_pairs = numbers 
        | std::views::chunk(2);    // 兩個(gè)兩個(gè)組隊(duì),多么整齊呀!
    
    // 來(lái)玩?zhèn)€水果超市的游戲!??
    std::vector<std::string> fruits = {"??蘋果", "??香蕉", "??橙子"};
    // 給每個(gè)水果標(biāo)上價(jià)格標(biāo)簽,就像在超市購(gòu)物一樣!
    auto fruit_prices = std::views::zip(fruits, numbers);
    
    // 讓我們看看中間那幾個(gè)活躍的小精靈都有誰(shuí)!
    std::cout << "? 閃亮登場(chǎng)的小精靈們:";
    for (int n : middle_numbers) {
        std::cout << n << " 號(hào)小精靈 ?? ";  // 3 4 5 6 號(hào)小精靈閃亮登場(chǎng)!
    }
}

看!這就像是在魔法世界里玩耍一樣!?? 我們可以讓數(shù)字小精靈們排隊(duì)(drop 和 take),讓它們手牽手組隊(duì)(chunk),甚至可以讓它們和水果小精靈們一起開派對(duì)(zip)!每一個(gè)視圖都像是給小精靈們施展的一個(gè)小魔法,而當(dāng)這些魔法連在一起,就會(huì)產(chǎn)生意想不到的精彩效果!?

這些魔法不僅好玩,還特別實(shí)用!就像是給我們的代碼加上了魔法翅膀,讓它們可以自由翱翔!?? 而最棒的是,這些魔法都是即用即取的,不會(huì)浪費(fèi)任何魔法能量,就像點(diǎn)外賣一樣,需要的時(shí)候才會(huì)開始準(zhǔn)備!??

記住,在這個(gè)充滿魔法的 Ranges 世界里,我們都是快樂的魔法師,可以自由組合這些有趣的魔法,創(chuàng)造出更多精彩的代碼!?? 讓我們一起在這個(gè)神奇的世界里探索吧!??

Range 概念大家族 - 每個(gè)都是獨(dú)當(dāng)一面的小能手!??

嘿,小伙伴們!今天讓我們來(lái)認(rèn)識(shí)一下 Ranges 庫(kù)里的幾位超級(jí)英雄吧!??♂? 他們就像是一個(gè)歡樂的大家族,每個(gè)成員都有自己的獨(dú)門絕技!

想象一下,ranges::range 就像是這個(gè)家族的族長(zhǎng) ??,它定義了最基本的"范圍"概念 - 只要你有開始和結(jié)束,就是一個(gè)范圍!就像是在說(shuō)"從這棵樹到那棵樹,這片草地都是我們家的"這樣簡(jiǎn)單!??

ranges::view 則是家族里最輕盈的舞者 ??,它能以最小的代價(jià)復(fù)制和移動(dòng)自己,就像一只靈巧的蝴蝶,輕輕掠過卻不會(huì)驚動(dòng)花朵!來(lái)看個(gè)例子:

std::vector<int> numbers = {1, 2, 3, 4, 5};
auto magical_view = numbers | std::views::filter([](int n) { return n % 2 == 0; });
// 哇!創(chuàng)建視圖的成本幾乎為零,就像變魔術(shù)一樣!?

然后是 ranges::sized_range,這位小可愛可厲害了 ??,它總是能在眨眼間(常數(shù)時(shí)間)告訴你范圍有多大!就像是一個(gè)神奇的計(jì)數(shù)器:

std::vector<int> items = {1, 2, 3};
std::cout << std::ranges::size(items) << " 個(gè)寶貝!"; // 瞬間就知道有3個(gè)!?

至于 ranges::input_range、ranges::forward_range 和 ranges::bidirectional_range,它們就像是三胞胎兄弟 ??????,各有各的本領(lǐng):

  • 老大只會(huì)往前沖(input) ??
  • 老二既能往前沖還記得回頭看看(forward) ??
  • 老三更厲害,前后溜達(dá)都不在話下(bidirectional) ??
std::list<std::string> magic_box = {"??", "??", "??"};
// 雙向列表,想往哪走就往哪走,多自在!
for(auto it = magic_box.begin(); it != magic_box.end(); ++it) {
    std::cout << *it << " 耶!";
}

?? 小提示:這些概念就像是魔法契約,在編譯時(shí)就能確保你的代碼和這些范圍玩得轉(zhuǎn)!不用擔(dān)心運(yùn)行時(shí)才發(fā)現(xiàn)不合拍的尷尬!??

有了這些可愛的概念,我們寫代碼就像是在魔法世界里玩耍,既安全又有趣!讓我們一起用這些神奇的工具,創(chuàng)造出更多精彩的代碼吧!?

Ranges的前世今生 - 一個(gè)代碼進(jìn)化的童話故事 ??

嘿,親愛的程序員朋友們!今天讓我來(lái)給大家講一個(gè)關(guān)于 Ranges 的童話故事~ ??

很久很久以前,在代碼的世界里,處理數(shù)據(jù)集合是一件特別麻煩的事情。程序員們不得不寫很多繁瑣的循環(huán)和迭代器代碼,就像這樣:

std::vector<int> scores = {60, 85, 92, 75, 88};
std::vector<int> passing_scores;
for(auto it = scores.begin(); it != scores.end(); ++it) {
    if(*it >= 80) {
        passing_scores.push_back(*it);
    }
}
// 天啊,好多重復(fù)的代碼! ??

直到有一天,D語(yǔ)言的小精靈帶來(lái)了一個(gè)神奇的想法 - "Range"! ??♀? 它告訴C++的設(shè)計(jì)者們:"嘿,為什么不能讓代碼讀起來(lái)像說(shuō)話一樣自然呢?"

與此同時(shí),一位叫 Eric Niebler 的魔法師創(chuàng)造了一個(gè)實(shí)驗(yàn)性的魔法箱子 - Range-v3 庫(kù)! ?? 它展示了一種全新的寫代碼方式:

// Range-v3 帶來(lái)的全新魔法! ?
auto passing_scores = scores 
    | views::filter([](int score) { return score >= 80; });
// 哇!代碼突然變得如此優(yōu)雅! ??

這個(gè)創(chuàng)意太棒啦!C++標(biāo)準(zhǔn)委員會(huì)的智者們看到后,決定把這個(gè)魔法帶給所有的程序員。他們精心設(shè)計(jì)了新的魔法咒語(yǔ),讓它變得更加強(qiáng)大:

// 來(lái)看看這個(gè)處理學(xué)生成績(jī)的例子吧!
std::vector<std::pair<std::string, int>> students = {
    {"小明", 95}, {"小紅", 85}, {"小華", 75}
};

// 使用現(xiàn)代魔法來(lái)找出優(yōu)秀學(xué)生! ??
auto honor_students = students
    | std::views::filter([](const auto& student) {
        return student.second >= 90;  // 找出90分以上的學(xué)生
    })
    | std::views::transform([](const auto& student) {
        return "?? 優(yōu)秀學(xué)生: " + student.first;  // 給他們加上小獎(jiǎng)杯!
    });

// 看看誰(shuí)是優(yōu)秀學(xué)生呀~
for(const auto& student : honor_students) {
    std::cout << student << "\n";  // 輸出: ?? 優(yōu)秀學(xué)生: 小明
}

這個(gè)魔法最厲害的地方是它的"惰性求值"特性 ?? - 不會(huì)立刻處理所有數(shù)據(jù),而是在實(shí)際需要結(jié)果時(shí)才進(jìn)行計(jì)算。就像是一個(gè)聰明的學(xué)生,不會(huì)提前做完所有作業(yè),而是按需完成每一步 - 既節(jié)省精力,又能確保高效!

而且這個(gè)魔法還特別聰明,它能在編譯的時(shí)候就發(fā)現(xiàn)問題:

// 假設(shè)我們想統(tǒng)計(jì)班級(jí)的平均分...
auto average = students
    | std::views::transform([](const auto& student) { 
        return student.second;  // 提取分?jǐn)?shù)
    })
    | std::views::filter([](int score) {  // ? 編譯器會(huì)說(shuō):"這樣不行哦!"
        return score >= 0;
    });
// 因?yàn)?transform 和 filter 的順序不對(duì),編譯器會(huì)及時(shí)提醒我們! ??

從2012年開始,這個(gè)魔法經(jīng)歷了漫長(zhǎng)的旅程:從實(shí)驗(yàn)室里的小火苗 ??,到2020年最終成為C++20標(biāo)準(zhǔn)庫(kù)中的一顆璀璨明星 ?。現(xiàn)在,它已經(jīng)成為了每個(gè)現(xiàn)代C++程序員的得力助手!

?? 小彩蛋: 知道為什么用管道符號(hào) | 嗎?因?yàn)樗雌饋?lái)就像是數(shù)據(jù)流動(dòng)的管道,讓代碼讀起來(lái)像在講故事一樣流暢!

有了這個(gè)強(qiáng)大的魔法,我們?cè)僖膊挥脤懩切┓爆嵉难h(huán)了。讓我們一起感謝那些為C++帶來(lái)這份禮物的魔法師們吧! ???

責(zé)任編輯:趙寧寧 來(lái)源: everystep
相關(guān)推薦

2024-12-09 15:00:00

C++20代碼標(biāo)記

2021-10-12 07:15:03

C++20特性

2023-11-04 20:00:02

C++20協(xié)程

2019-11-25 10:20:54

CSS代碼javascript

2024-12-18 11:30:00

C++20比較運(yùn)算符

2017-12-07 15:05:50

全球互聯(lián)網(wǎng)創(chuàng)新峰會(huì)

2022-10-31 07:09:15

拷貝代碼項(xiàng)目

2023-03-15 15:54:36

Java代碼

2024-01-19 21:07:22

C++20Concepts函數(shù)

2024-12-24 15:02:10

2021-09-27 10:03:55

裝飾器代碼

2025-04-07 07:30:00

JavaScript前端

2020-12-21 21:05:29

C++C++20標(biāo)準(zhǔn)草案

2024-02-26 16:40:58

2020-12-21 13:33:00

medit編輯器Linux

2024-02-05 22:13:50

C++C++20開發(fā)

2021-07-12 07:08:54

責(zé)任鏈模式對(duì)象

2023-11-23 16:46:55

LinuxAWK運(yùn)維

2017-09-08 15:43:44

編程程序搜索

2025-01-03 08:34:40

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)