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

พื้นฐาน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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