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

เวกเตอร์เทียบกับ 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-checked

std::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 both

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

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

  1. พื้นฐาน std::vector: push_back size capacity
  2. การวนซ้ำเวกเตอร์: ดัชนี range-for ตัววนซ้ำ
  3. การแก้ไขเวกเตอร์: insert erase clear
  4. เวกเตอร์เทียบกับ std::array และอาร์เรย์ C
← กลับไปที่ C++ Academy