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

ขอบเขตและซับสแปน

ตัดแบ่งสแปนอย่างปลอดภัย

บทเรียน 4 จาก 413 ขั้นตอน

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

การตัดส่วนด้วย subspan

s.subspan(offset, count) คืนค่า span ที่ครอบคลุมเพียงบางส่วนของข้อมูลต้นฉบับ โดยไม่คัดลอก แต่สร้างพอยน์เตอร์กับความยาวใหม่เท่านั้น

#include <iostream>
#include <span>
int main() {
    int buf[] = {0, 1, 2, 3, 4};
    std::span<int> s(buf, 5);
    auto mid = s.subspan(1, 3);
    for (int x : mid) std::cout << x << " ";
    std::cout << "\n"; // 1 2 3
}

first และ last

first(n) และ last(n) ให้ span ที่ครอบคลุม n องค์ประกอบด้านต้นหรือด้านท้าย

#include <iostream>
#include <span>
int main() {
    int buf[] = {10, 20, 30, 40};
    std::span<int> s(buf, 4);
    auto f = s.first(2);
    auto l = s.last(2);
    std::cout << f[0] << " " << l[1] << "\n"; // 10 40
}

Subspan ใช้หน่วยความจำร่วมกัน

การแก้ไข subspan จะเปลี่ยนแปลงข้อมูลต้นฉบับด้วย เพราะทั้งสองชี้ไปยังบัฟเฟอร์เดียวกัน

#include <iostream>
#include <span>
int main() {
    int buf[] = {1, 1, 1, 1};
    std::span<int> s(buf, 4);
    auto tail = s.last(2);
    tail[0] = 99;
    std::cout << buf[2] << "\n"; // 99
}

size_bytes

size_bytes() คืนค่าขนาดรวมเป็นไบต์ขององค์ประกอบใน span ซึ่งมีประโยชน์สำหรับอินพุต/เอาต์พุตระดับล่าง

#include <iostream>
#include <span>
int main() {
    int buf[] = {1, 2, 3};
    std::span<int> s(buf, 3);
    std::cout << s.size_bytes() << "\n"; // 3 * sizeof(int)
}

คุณต้องรับผิดชอบขอบเขตเอง

operator[] ของ span ไม่ตรวจสอบขอบเขต การอ่าน s[s.size()] มีพฤติกรรมที่ไม่กำหนด

ตรวจสอบก่อนตัดส่วน

การเรียก subspan โดยใช้ออฟเซ็ตหรือจำนวนที่มากกว่าขนาดของ span มีพฤติกรรมที่ไม่กำหนด ดังนั้นให้ตรวจสอบกับ size() ก่อน

#include <iostream>
#include <span>
int main() {
    int buf[] = {1, 2, 3};
    std::span<int> s(buf, 3);
    size_t off = 1, cnt = 2;
    if (off + cnt <= s.size()) {
        auto sub = s.subspan(off, cnt);
        std::cout << sub.size() << "\n";
    }
}

ว่างเปล่าหลังการตัดส่วน

การตัดส่วนอาจได้ span ว่าง เช่น first(0) ให้จัดการกับ span นี้เหมือนช่วงว่างทั่วไป

#include <iostream>
#include <span>
int main() {
    int buf[] = {1, 2};
    std::span<int> s(buf, 2);
    auto e = s.first(0);
    std::cout << e.empty() << "\n"; // 1
}

การตัดส่วนต่อเนื่อง

สามารถตัดส่วนจาก subspan ต่อได้ เพราะแต่ละส่วนเป็นเพียงมุมมองอีกแบบหนึ่งของบัฟเฟอร์ต้นฉบับ

#include <iostream>
#include <span>
int main() {
    int buf[] = {0, 1, 2, 3, 4, 5};
    std::span<int> s(buf, 6);
    auto inner = s.subspan(1, 4).first(2);
    std::cout << inner[0] << " " << inner[1] << "\n"; // 1 2
}

ประมวลผลเป็นชุดย่อย

การใช้งาน subspan ที่พบบ่อยคือการวนซ้ำผ่านบัฟเฟอร์ขนาดใหญ่โดยแบ่งเป็นหน้าต่างขนาดคงที่สำหรับการสตรีมหรือการประมวลผลเป็นชุด

#include <iostream>
#include <span>
int main() {
    int buf[] = {1, 2, 3, 4, 5, 6};
    std::span<int> s(buf, 6);
    for (size_t i = 0; i < s.size(); i += 2) {
        auto chunk = s.subspan(i, 2);
        std::cout << "[" << chunk[0] << "," << chunk[1] << "] ";
    }
    std::cout << "\n";
}

การตรวจสอบขอบเขตแบบคงที่

เมื่อใช้ span ที่มีขอบเขตคงที่ คอมไพเลอร์สามารถตรวจสอบขนาดของบางส่วนได้ตั้งแต่เวลาคอมไพล์ ทำให้พบข้อผิดพลาดได้เร็วขึ้น

อายุการใช้งานยังคงมีผล

ทุก subspan ใช้อายุการใช้งานเดียวกับบัฟเฟอร์ต้นฉบับ หากแหล่งข้อมูลถูกทำลายหรือจัดสรรใหม่ span ที่สร้างจากแหล่งข้อมูลนั้นทั้งหมดจะไม่ถูกต้อง

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

ตรวจสอบความเข้าใจเกี่ยวกับ subspan และขอบเขต

สรุปทบทวน

คุณได้เรียนรู้ขอบเขตและ subspanแล้ว:

  • subspan, first, last สร้างส่วนย่อยโดยไม่จัดสรรหน่วยความจำ
  • Subspan ใช้หน่วยความจำร่วมกัน การแก้ไขจึงส่งผลต่อข้อมูลต้นฉบับ
  • operator[] และการตัดส่วนไม่ตรวจสอบขอบเขต ต้องตรวจสอบก่อน
  • Subspan ทั้งหมดใช้อายุการใช้งานเดียวกับแหล่งข้อมูลต้นทาง
เริ่มต้นได้ฟรี

เรียนรู้ C++ ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
51
บทเรียน
203

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

บทเรียน “ขอบเขตและซับสแปน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ขอบเขตและซับสแปน”

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

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

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

บทเรียน “ขอบเขตและซับสแปน” ใช้เวลานานแค่ไหน

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

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

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

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

  1. std::array ขนาดคงที่
  2. พื้นฐาน std::span
  3. การส่ง Span ให้ฟังก์ชัน
  4. ขอบเขตและซับสแปน
← กลับไปที่ C++ Academy