เวกเตอร์เทียบกับ std::array และอาร์เรย์ C
เปรียบเทียบคอนเทนเนอร์ตามลำดับทั้งสามแบบ และเลือกใช้ตามขนาด การครอบครองข้อมูล และประสิทธิภาพ
เวกเตอร์เทียบกับ std::array และอาร์เรย์ C เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คอนเทนเนอร์แบบลำดับต่อเนื่องสามชนิด
C++ มีวิธีจัดเก็บลำดับข้อมูลที่อยู่ต่อเนื่องกันสามแบบ:
- std::vector — ขนาดเปลี่ยนแปลงได้ จัดเก็บบนฮีป
- std::array — ขนาดคงที่ตั้งแต่เวลาคอมไพล์ จัดเก็บบนสแตก
- อาร์เรย์แบบ C — ขนาดคงที่ ระดับต่ำ
อาร์เรย์แบบ C
รูปแบบที่เก่าแก่ที่สุด ขนาดเป็นส่วนหนึ่งของชนิดข้อมูล และจะเปลี่ยนเป็น pointer เมื่อส่งให้ฟังก์ชัน ทำให้ขนาดสูญหายไป
int a[5] = {1, 2, 3, 4, 5};
std::cout << a[2]; // 3ปัญหาของอาร์เรย์แบบ C
อาร์เรย์เหล่านี้มักลืมขนาดของตัวเองในบริบทส่วนใหญ่ ไม่ตรวจสอบขอบเขต และนำไปใช้ผิดได้ง่าย ในโค้ดใหม่ควรเลือกใช้ std::array หรือ std::vector มากกว่า
std::array (C++11)
ตัวห่อหุ้มแบบบางสำหรับอาร์เรย์ขนาดคงที่ ประสิทธิภาพเทียบเท่าอาร์เรย์แบบ C แต่มีชนิดข้อมูลจริงและฟังก์ชันสมาชิกที่เหมาะสม
#include <array>
std::array<int, 5> a = {1, 2, 3, 4, 5};
std::cout << a.size(); // 5
std::cout << a.at(2); // bounds-checkedstd::array อยู่บนสแตก
ต่างจาก vector ตรงที่ std::array จัดเก็บสมาชิกไว้โดยตรง จึงไม่มีการจัดสรรหน่วยความจำบนฮีป และขนาดเป็นพารามิเตอร์ของแม่แบบ
ใช้ std::vector เมื่อขนาดเปลี่ยนแปลงได้
ใช้ std::vector เมื่อไม่ทราบขนาดขณะคอมไพล์ หรือเมื่อขนาดจะเปลี่ยนแปลงขณะโปรแกรมทำงาน
การเปรียบเทียบประสิทธิภาพ
สำหรับขนาดคงที่ ทั้งสามแบบมีประสิทธิภาพใกล้เคียงกัน std::vector มีค่าใช้จ่ายเพิ่มเติมเล็กน้อยจากการเก็บข้อมูลกำกับ pointer และขนาด รวมถึงการอ้างอิงทางอ้อมอีกหนึ่งระดับ
การส่งให้ฟังก์ชัน
ส่ง vector หรือ std::array โดยการอ้างอิงแบบ const เพื่อหลีกเลี่ยงการคัดลอก เมื่อยืมข้อมูลจากอาร์เรย์แบบ C ควรแทนที่ด้วย std::span (C++20)
void process(const std::vector<int>& v);
void process(const std::array<int, 5>& a);
#include <span>
void process(std::span<const int> data); // accepts bothstd::span (C++20)
มุมมองที่ไม่เป็นเจ้าของข้อมูล ซึ่งครอบคลุมลำดับข้อมูลที่อยู่ต่อเนื่องกัน มีลักษณะเหมือนคู่ pointer กับความยาว และรองรับ vector, std::array รวมถึงอาร์เรย์แบบ C ได้ในรูปแบบเดียวกัน
ควรเลือกใช้แบบใด
แผนผังการตัดสินใจ:
- ต้องการขนาดที่เปลี่ยนแปลงได้ →
std::vector - ขนาดคงที่และไม่ต้องจัดสรรหน่วยความจำ →
std::array - ต้องการยืมข้อมูลโดยไม่เป็นเจ้าของ →
std::span - ต้องทำงานร่วมกับโค้ดภาษา C → อาร์เรย์แบบ C
การแปลงระหว่างชนิดข้อมูล
คุณสามารถคัดลอกสมาชิกระหว่างชนิดข้อมูลเหล่านี้ได้โดยใช้ช่วงข้อมูลหรืออัลกอริทึม
std::array<int, 3> a = {1, 2, 3};
std::vector<int> v(a.begin(), a.end());
int c[3];
std::copy(a.begin(), a.end(), c);ตรวจสอบความเข้าใจ
คอนเทนเนอร์ใดจัดเก็บสมาชิกบนสแตกและมีขนาดที่ทราบตั้งแต่เวลาคอมไพล์
สรุปทบทวน
เลือกใช้ std::vector สำหรับขนาดที่เปลี่ยนแปลงได้ และ std::array สำหรับขนาดคงที่ อาร์เรย์แบบ C มักไม่ใช่ตัวเลือกที่ดีที่สุดในโค้ดสมัยใหม่ ใช้ std::span เพื่อยืมลำดับข้อมูลโดยไม่เป็นเจ้าของข้อมูล
คำถามที่พบบ่อย
บทเรียน “เวกเตอร์เทียบกับ std::array และอาร์เรย์ C” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เวกเตอร์เทียบกับ std::array และอาร์เรย์ C” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เวกเตอร์เทียบกับ std::array และอาร์เรย์ C”
เปรียบเทียบคอนเทนเนอร์ตามลำดับทั้งสามแบบ และเลือกใช้ตามขนาด การครอบครองข้อมูล และประสิทธิภาพ คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “เวกเตอร์เทียบกับ std::array และอาร์เรย์ C” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน std::vector: push_back size capacity
- การวนซ้ำเวกเตอร์: ดัชนี range-for ตัววนซ้ำ
- การแก้ไขเวกเตอร์: insert erase clear
- เวกเตอร์เทียบกับ std::array และอาร์เรย์ C