บทนำไลบรารี 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- หมวดหมู่ตัววนซ้ำ input forward bidirectional random
- รูปแบบตัววนซ้ำทั่วไป begin end advance
- บทนำไลบรารี Ranges ใน C++20
- ตัวปรับช่วง views::filter transform take