ขอบเขตและซับสแปน
ตัดแบ่งสแปนอย่างปลอดภัย
ขอบเขตและซับสแปน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- std::array ขนาดคงที่
- พื้นฐาน std::span
- การส่ง Span ให้ฟังก์ชัน
- ขอบเขตและซับสแปน