พื้นฐาน std::span
วิวที่ไม่เป็นเจ้าของข้อมูลต่อเนื่อง
พื้นฐาน std::span เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
มุมมองที่ไม่ได้เป็นเจ้าของข้อมูล
std::span<T> (C++20) เป็นมุมมองน้ำหนักเบาเหนือลำดับข้อมูลที่ต่อเนื่องกัน คล้ายกับ string_view แต่ใช้ได้กับองค์ประกอบทุกชนิด ให้ include <span>
#include <iostream>
#include <span>
#include <array>
int main() {
std::array<int, 3> a = {1, 2, 3};
std::span<int> s = a;
std::cout << s.size() << "\n";
}span ไม่ได้เป็นเจ้าของข้อมูล
span จะเก็บพอยน์เตอร์และความยาวไว้ โดยสังเกตข้อมูลที่มีเจ้าของอยู่ที่อื่นและไม่เคยคัดลอกองค์ประกอบ
#include <iostream>
#include <vector>
#include <span>
int main() {
std::vector<int> v = {5, 6, 7};
std::span<int> s = v;
s[0] = 50; // modifies v
std::cout << v[0] << "\n"; // 50
}จาก std::array
อาร์เรย์จะแปลงเป็น span โดยอัตโนมัติ และ span จะมองเห็นองค์ประกอบทั้งหมดของอาร์เรย์
#include <iostream>
#include <span>
#include <array>
int main() {
std::array<int, 4> a = {1, 2, 3, 4};
std::span<int> s{a};
for (int x : s) std::cout << x << " ";
std::cout << "\n";
}จากเวกเตอร์
std::vector ก็แปลงเป็น span ได้เช่นกัน ทำให้ได้มุมมองแบบเดียวกันไม่ว่าคอนเทนเนอร์ต้นทางจะเป็นชนิดใด
#include <iostream>
#include <vector>
#include <span>
int main() {
std::vector<int> v = {9, 8, 7};
std::span<int> s = v;
std::cout << s.front() << " " << s.back() << "\n";
}จากพอยน์เตอร์และขนาด
คุณสามารถสร้าง span จากพอยน์เตอร์ดิบและจำนวนองค์ประกอบได้ ซึ่งเหมาะสำหรับบัฟเฟอร์แบบ C
#include <iostream>
#include <span>
int main() {
int buf[] = {10, 20, 30};
std::span<int> s(buf, 3);
std::cout << s[1] << "\n"; // 20
}การวนซ้ำผ่าน span
span รองรับลูป for แบบอิงช่วงและอินเทอร์เฟซคอนเทนเนอร์ตามปกติ (size, front, back, data)
#include <iostream>
#include <span>
int main() {
int buf[] = {2, 4, 6, 8};
std::span<int> s(buf, 4);
int sum = 0;
for (int x : s) sum += x;
std::cout << sum << "\n"; // 20
}span แบบอ่านอย่างเดียว
std::span<const int> ให้สิทธิ์เข้าถึงแบบอ่านอย่างเดียว ใช้เมื่อฟังก์ชันไม่ควรแก้ไขข้อมูล
#include <iostream>
#include <span>
int main() {
int buf[] = {1, 2, 3};
std::span<const int> s(buf, 3);
std::cout << s[2] << "\n"; // 3
}แก้ไขข้อมูลผ่าน span ได้
span ที่ไม่ใช่ const สามารถเปลี่ยนแปลงองค์ประกอบต้นทางได้ เนื่องจาก span ชี้ไปยังข้อมูลจริง
#include <iostream>
#include <span>
int main() {
int buf[] = {1, 1, 1};
std::span<int> s(buf, 3);
for (int& x : s) x *= 10;
std::cout << buf[2] << "\n"; // 10
}ขอบเขตแบบไดนามิกกับแบบคงที่
โดยค่าเริ่มต้น span จะมีขนาดแบบไดนามิก แต่คุณสามารถกำหนดขนาดให้คงที่ตั้งแต่เวลาคอมไพล์ด้วย std::span<int, 3> เพื่อเพิ่มการตรวจสอบ
ไม่ต้องจัดสรรหน่วยความจำ ส่งต่อได้อย่างประหยัด
เช่นเดียวกับมุมมองทั้งหมด span คัดลอกและส่งต่อแบบค่าได้อย่างประหยัด เพราะเก็บไว้เพียงพอยน์เตอร์กับความยาว
ระวังอายุการใช้งาน
span จะใช้งานได้ตราบเท่าที่แหล่งข้อมูลของมันยังมีอยู่และยังไม่ถูกจัดสรรใหม่ อย่าเก็บ span ที่ชี้ไปยังเวกเตอร์ซึ่งจะขยายในภายหลัง
ตรวจสอบความเข้าใจ
ตรวจสอบความเข้าใจเกี่ยวกับ std::span ของคุณ
สรุปทบทวน
คุณได้เรียนรู้พื้นฐานของ std::spanแล้ว:
- เป็นมุมมองที่ไม่ได้เป็นเจ้าของข้อมูลต่อเนื่องกัน (อาร์เรย์ เวกเตอร์ หรือบัฟเฟอร์ดิบ)
- เก็บพอยน์เตอร์กับความยาวไว้ โดยไม่คัดลอกหรือจัดสรรหน่วยความจำ
- span แบบ
constอ่านได้อย่างเดียว ส่วน span ที่เปลี่ยนแปลงได้จะแก้ไขข้อมูลต้นทาง - ใช้งานได้ตราบเท่าที่แหล่งข้อมูลยังมีอยู่
คำถามที่พบบ่อย
บทเรียน “พื้นฐาน std::span” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “พื้นฐาน std::span” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐาน std::span”
วิวที่ไม่เป็นเจ้าของข้อมูลต่อเนื่อง คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “พื้นฐาน std::span” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- std::array ขนาดคงที่
- พื้นฐาน std::span
- การส่ง Span ให้ฟังก์ชัน
- ขอบเขตและซับสแปน