0Pricing
C++ Academy · บทเรียน

บทนำไลบรารี Ranges ใน C++20

ใช้อัลกอริทึม std::ranges ที่รับช่วงข้อมูลแทนคู่ตัววนซ้ำ

บทนำไลบรารี Ranges ใน C++20 เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

ทำไมต้องใช้ Ranges

STL แบบดั้งเดิมรับคู่ตัววนซ้ำ (v.begin(), v.end()) ส่วน ranges ใน C++20 รับค่าช่วงข้อมูลเพียงค่าเดียวและเพิ่มความสามารถในการประกอบการทำงานต่อกัน

การรวม Ranges

ให้รวม <ranges> โดยใช้เนมสเปซ std::ranges สำหรับอัลกอริทึม และ std::views สำหรับมุมมองแบบประเมินค่าเมื่อใช้งาน

#include <ranges>
#include <algorithm>

อัลกอริทึมของช่วงข้อมูล

อัลกอริทึมมาตรฐานทุกชนิดมีรุ่นสำหรับ ranges ซึ่งรับช่วงข้อมูลแทนตัววนซ้ำสองตัว

std::vector<int> v = {3, 1, 4, 1, 5};
std::ranges::sort(v);             // sort the whole range
auto it = std::ranges::find(v, 4);

ฟังก์ชันฉายค่า

อัลกอริทึมของ ranges รับ การฉายค่า ที่เป็นตัวเลือก ซึ่งเป็นฟังก์ชันที่ใช้กับสมาชิกแต่ละตัวก่อนการเปรียบเทียบ ช่วยไม่ให้ต้องเขียนตัวเปรียบเทียบกำหนดเอง

struct Person { std::string name; int age; };
std::vector<Person> people;
std::ranges::sort(people, {}, &Person::age);
// sort by age, default comparison

ช่วงข้อมูลคืออะไร

ช่วงข้อมูลคือสิ่งใดก็ตามที่รองรับ begin() และ end() ซึ่งรวมถึงคอนเทนเนอร์ อาร์เรย์ และใน C++20 ยังรวมถึงชนิดข้อมูลกำหนดเองใด ๆ ที่เปิดเผยตัวบอกจุดสิ้นสุด

ตัวบอกจุดสิ้นสุด

C++20 ทำให้ end() เป็นตัวบอกจุดสิ้นสุด sentinel ในรูปแบบทั่วไปมากขึ้น โดยไม่จำเป็นต้องเป็นชนิดเดียวกับตัววนซ้ำ มีประโยชน์สำหรับสตรีมอินพุตและช่วงข้อมูลอนันต์

มุมมอง: ไปป์ไลน์ช่วงข้อมูลแบบประเมินค่าเมื่อใช้งาน

มุมมอง คือช่วงข้อมูลที่ไม่ได้เป็นเจ้าของสมาชิกและสร้างสมาชิกตามต้องการ ให้ประกอบมุมมองเข้าด้วยกันด้วยตัวดำเนินการไปป์ |

auto squares = v
    | std::views::filter([](int x) { return x % 2 == 0; })
    | std::views::transform([](int x) { return x * x; });

for (int x : squares) std::cout << x << " ";

การประเมินค่าแบบเลื่อนเวลา

มุมมองจะไม่จัดสรรหน่วยความจำหรือทำงานจนกว่าจะมีการวนซ้ำ filter | transform | take(5) จะสร้างเฉพาะค่าที่แปลงแล้ว 5 ค่าแรกเท่านั้น ไม่สร้างมากกว่านั้น

ช่วงข้อมูลที่ยืมมาและอายุการใช้งาน

มุมมองจะยืมช่วงข้อมูลต้นทาง หากต้นทางหมดอายุ มุมมองก็จะกลายเป็นตัวอ้างอิงที่ห้อยอยู่ โปรดระวังการใช้มุมมองกับอ็อบเจ็กต์ชั่วคราว แม้ว่า C++20 จะเพิ่มกลไกป้องกันไว้แล้ว

แบบทำงานทันทีเทียบกับแบบประเมินค่าเมื่อใช้งาน

อัลกอริทึมสร้างผลลัพธ์ทันที (คำนวณเดี๋ยวนั้น) ส่วนมุมมองจะประเมินค่าเมื่อวนซ้ำ (คำนวณขณะวนซ้ำ) ให้เลือกตามว่าต้องการสร้างผลลัพธ์เป็นข้อมูลจริงหรือไม่

ประสิทธิภาพ

ไปป์ไลน์แบบประเมินค่าเมื่อใช้งานช่วยหลีกเลี่ยงคอนเทนเนอร์ชั่วคราว คอมไพเลอร์มักปรับไปป์ไลน์ให้มีประสิทธิภาพเสมือนเป็นลูปเดียว ตรวจสอบด้วย godbolt เพื่อยืนยันได้

แนวทางการย้ายระบบ

หากไม่สามารถใช้ C++20 ได้ ไลบรารีอย่าง range-v3 ของ Eric Niebler ก็มีรูปแบบเดียวกันใน C++14/17 การเรียนรู้ไว้ตั้งแต่วันนี้จะช่วยให้ย้ายระบบได้ง่ายขึ้น

ตรวจสอบความเข้าใจ

ข้อดีหลักของ ranges ใน C++20 เมื่อเทียบกับรูปแบบ STL ที่ใช้คู่ตัววนซ้ำคืออะไร

ทบทวน

ranges ใน C++20 ทำให้อัลกอริทึมของ STL ทันสมัยขึ้น โดยรับช่วงข้อมูลเพียงช่วงเดียว ใช้การฉายค่า และสร้างไปป์ไลน์แบบประเมินค่าเมื่อใช้งานด้วยมุมมอง ตัวดำเนินการไปป์ช่วยประกอบการกรอง การแปลง และการเลือกจำนวนสมาชิกให้เป็นโค้ดเชิงประกาศที่เข้าใจง่าย

คำถามที่พบบ่อย

บทเรียน “บทนำไลบรารี Ranges ใน C++20” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “บทนำไลบรารี Ranges ใน C++20” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “บทนำไลบรารี Ranges ใน C++20”

ใช้อัลกอริทึม std::ranges ที่รับช่วงข้อมูลแทนคู่ตัววนซ้ำ คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “บทนำไลบรารี Ranges ใน C++20” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. หมวดหมู่ตัววนซ้ำ input forward bidirectional random
  2. รูปแบบตัววนซ้ำทั่วไป begin end advance
  3. บทนำไลบรารี Ranges ใน C++20
  4. ตัวปรับช่วง views::filter transform take
← กลับไปที่ C++ Academy