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

การส่ง Span ให้ฟังก์ชัน

เขียน API ที่ยืดหยุ่น

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

ฟังก์ชันเดียวกับคอนเทนเนอร์หลายชนิด

ฟังก์ชันที่รับ std::span จะรับอาร์เรย์ เวกเตอร์ และบัฟเฟอร์ดิบได้เหมือนกัน โดยไม่ต้องใช้เทมเพลตหรือโอเวอร์โหลดหลายแบบ

#include <iostream>
#include <span>
#include <vector>
#include <array>
int sum(std::span<const int> s) {
    int t = 0; for (int x : s) t += x; return t;
}
int main() {
    std::vector<int> v = {1, 2, 3};
    std::array<int, 2> a = {4, 5};
    std::cout << sum(v) << " " << sum(a) << "\n";
}

ไม่ต้องใช้พารามิเตอร์ขนาด

API แบบ C รุ่นเก่าจะส่งพอยน์เตอร์พร้อมขนาดแยกกัน ส่วน span รวมทั้งสองอย่างไว้ด้วยกัน จึงกำจัดข้อผิดพลาดจากความยาวที่ไม่ตรงกัน

#include <iostream>
#include <span>
void printAll(std::span<const int> s) {
    for (int x : s) std::cout << x << " ";
    std::cout << "\n";
}
int main() {
    int buf[] = {7, 8, 9};
    printAll(buf); // size inferred
}

const span สำหรับการอ่านอย่างเดียว

ใช้ std::span<const T> เพื่อรับรองว่าฟังก์ชันจะไม่แก้ไขข้อมูลของผู้เรียก

#include <iostream>
#include <span>
int maxOf(std::span<const int> s) {
    int m = s[0];
    for (int x : s) if (x > m) m = x;
    return m;
}
int main() {
    int data[] = {3, 9, 4};
    std::cout << maxOf(data) << "\n"; // 9
}

span ที่เปลี่ยนแปลงได้สำหรับแก้ไขโดยตรง

span ที่ไม่ใช่ const ช่วยให้ฟังก์ชันแก้ไของค์ประกอบของผู้เรียกได้โดยตรง

#include <iostream>
#include <span>
#include <vector>
void doubleAll(std::span<int> s) {
    for (int& x : s) x *= 2;
}
int main() {
    std::vector<int> v = {1, 2, 3};
    doubleAll(v);
    std::cout << v[2] << "\n"; // 6
}

หลีกเลี่ยงโค้ดเทมเพลตที่ขยายตัว

หากไม่มี span คุณอาจต้องใช้เทมเพลตกับชนิดของคอนเทนเนอร์ ซึ่งทำให้เกิดการสร้างอินสแตนซ์หลายแบบ ส่วน span ให้ลายเซ็นฟังก์ชันแบบรูปธรรมเพียงหนึ่งแบบที่ใช้งานได้ทันที

หลีกเลี่ยงการคัดลอก

การส่ง span ไม่เคยคัดลอกองค์ประกอบ มีเพียงพอยน์เตอร์กับความยาวที่ถูกส่งเข้าไปในฟังก์ชัน

#include <iostream>
#include <span>
#include <vector>
size_t count(std::span<const int> s) { return s.size(); }
int main() {
    std::vector<int> big(1000, 0);
    std::cout << count(big) << "\n"; // no copy of 1000 ints
}

span ว่างก็ใช้งานได้

ฟังก์ชันควรจัดการกับ span ว่างได้อย่างเหมาะสม โดย size() จะมีค่าเป็นศูนย์ และลูป for แบบอิงช่วงจะทำงานเป็นศูนย์รอบ

#include <iostream>
#include <span>
int sum(std::span<const int> s) { int t = 0; for (int x : s) t += x; return t; }
int main() {
    std::span<const int> empty;
    std::cout << sum(empty) << "\n"; // 0
}

ส่งตามค่า

span มีขนาดเล็ก จึงควรส่งตามค่า ไม่ใช่ส่งตามการอ้างอิง การคัดลอกพอยน์เตอร์กับความยาวแทบไม่มีต้นทุน

ระบุเจตนาเกี่ยวกับ const ในเอกสาร

การเลือก span<const T> หรือ span<T> ทำให้ผู้เรียกทราบได้ทันทีว่าข้อมูลของตนอาจถูกแก้ไขหรือไม่

ผู้เรียกยังคงเป็นเจ้าของข้อมูล

ผู้เรียกยังคงเป็นเจ้าของคอนเทนเนอร์ ส่วน span เพียงยืมคอนเทนเนอร์นั้นตลอดระยะเวลาที่เรียกฟังก์ชัน ฟังก์ชันต้องไม่เก็บ span ไว้หลังจากการเรียกสิ้นสุด

รูปแบบ API สมัยใหม่

การรับ span เป็นวิธีสมัยใหม่ตามแนวทางมาตรฐานในการเขียนฟังก์ชันสำหรับข้อมูลที่ต่อเนื่องกัน มีความยืดหยุ่น ปลอดภัย และไม่ต้องคัดลอก

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

ตรวจสอบความเข้าใจเกี่ยวกับการส่ง span

สรุปทบทวน

คุณได้เรียนรู้การส่ง span ให้ฟังก์ชันแล้ว:

  • ลายเซ็นเดียวรองรับอาร์เรย์ เวกเตอร์ และบัฟเฟอร์
  • span<const T> ใช้สำหรับการอ่านอย่างเดียว ส่วน span<T> ใช้แก้ไขข้อมูลโดยตรง
  • ส่งตามค่าโดยไม่คัดลอกข้อมูล
  • ผู้เรียกยังคงเป็นเจ้าของข้อมูล อย่าเก็บ span ไว้หลังจากการเรียกสิ้นสุด

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

บทเรียน “การส่ง Span ให้ฟังก์ชัน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การส่ง Span ให้ฟังก์ชัน”

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

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

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

บทเรียน “การส่ง Span ให้ฟังก์ชัน” ใช้เวลานานแค่ไหน

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

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

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

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

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