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