เวกเตอร์ใน C++ ไลบรารีเทมเพลตมาตรฐาน (STL) พร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

เวกเตอร์ใน C++ เป็นอาร์เรย์แบบไดนามิกจากไลบรารีเทมเพลตมาตรฐาน (Standard Template Library) ที่ปรับขนาดตัวเองโดยอัตโนมัติเมื่อมีการเพิ่มหรือลบองค์ประกอบ โดยจัดเก็บรายการต่างๆ ไว้ในหน่วยความจำที่ต่อเนื่องกัน ทำให้นักโปรแกรมสามารถเข้าถึงและวนซ้ำรายการเหล่านั้นได้โดยใช้ตัววนซ้ำ (iterator)

  • 📦 อาร์เรย์แบบไดนามิก: A C++ เวกเตอร์จะขยายหรือหดตัวโดยอัตโนมัติ ซึ่งแตกต่างจากอาร์เรย์คงที่ที่มีขนาดตายตัว
  • 🧩 ส่วนหัวและไวยากรณ์: รวมส่วนหัวของเวกเตอร์ จากนั้นประกาศเวกเตอร์ ชื่อสำหรับจัดเก็บองค์ประกอบประเภทต่างๆ
  • 🧭 ตัววนซ้ำ: เมธอด begin(), end(), cbegin() และ cend() จะเลื่อนไปตามองค์ประกอบของเวกเตอร์เหมือนกับตัวชี้
  • 🛠️ ตัวดัดแปลง: ฟังก์ชัน push_back(), insert(), pop_back(), erase() และ clear() จะเปลี่ยนเนื้อหาของเวกเตอร์
  • 📐 ความจุ: ฟังก์ชัน size(), capacity(), max_size(), resize() และ empty() ใช้สำหรับรายงานหรือปรับขนาดพื้นที่จัดเก็บข้อมูล
  • 🤖 ความช่วยเหลือจากเอไอ: GitHub Copilot และผู้ช่วย AI ที่คล้ายกันจะสร้างโครงสร้างการดำเนินการเวกเตอร์จากข้อความแสดงความคิดเห็นสั้นๆ

C++ เวกเตอร์ STL

อะไรคือ a C++ เวกเตอร์?

A C++ เวกเตอร์คืออาร์เรย์แบบไดนามิกที่สามารถปรับขนาดตัวเองได้โดยอัตโนมัติ การปรับขนาดจะเกิดขึ้นหลังจากเพิ่มหรือลบองค์ประกอบออกจากเวกเตอร์แล้ว พื้นที่จัดเก็บจะถูกจัดการโดยอัตโนมัติโดยคอนเทนเนอร์ องค์ประกอบของเวกเตอร์จะถูกจัดเก็บในพื้นที่จัดเก็บแบบต่อเนื่อง ซึ่งช่วยให้ C++ โปรแกรมเมอร์สามารถเข้าถึงและเคลื่อนผ่านองค์ประกอบเวกเตอร์โดยใช้ตัววนซ้ำ

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

ก่อนที่จะเขียนโค้ดโดยใช้เวกเตอร์ การรู้ว่าเมื่อใดจึงเหมาะสมที่จะใช้เวกเตอร์เป็นคอนเทนเนอร์นั้นจะเป็นประโยชน์

เมื่อใดจึงควรใช้เวกเตอร์?

A C++ เวกเตอร์ควรใช้ภายใต้สถานการณ์ต่อไปนี้:

  • เมื่อต้องรับมือกับองค์ประกอบข้อมูลที่เปลี่ยนแปลงอย่างต่อเนื่อง
  • หากไม่ทราบขนาดของข้อมูลก่อนเริ่มใช้งาน เวกเตอร์จะไม่ขอให้คุณกำหนดขนาดสูงสุดของคอนเทนเนอร์

วิธีการเตรียมใช้งานเวกเตอร์ในรูปแบบ C++

ไวยากรณ์ของเวกเตอร์ใน C++ คือ:

vector <data-type> name (items)

ดังที่แสดงไว้ข้างต้น เราจะเริ่มต้นด้วยคำสำคัญเวกเตอร์

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

เมื่อมีเวกเตอร์อยู่แล้ว ตัววนซ้ำจะให้วิธีการคล้ายตัวชี้เพื่อเลื่อนไปตามองค์ประกอบต่างๆ ของเวกเตอร์นั้น

ตัววนซ้ำ

จุดประสงค์ของตัววนซ้ำ (iterator) คือการช่วยให้เราเข้าถึงองค์ประกอบที่จัดเก็บอยู่ในเวกเตอร์ มันเป็นวัตถุที่ทำงานคล้ายกับตัวชี้ ต่อไปนี้คือตัววนซ้ำทั่วไปที่รองรับโดยเวกเตอร์ C++ เวกเตอร์:

  • vector::begin(): มันให้ตัววนซ้ำที่ชี้ไปที่องค์ประกอบแรกของเวกเตอร์
  • เวกเตอร์::เอนด์(): มันให้ตัววนซ้ำที่ชี้ไปยังองค์ประกอบที่ผ่านมาถึงจุดสิ้นสุดของเวกเตอร์
  • เวกเตอร์::cbegin(): มันเหมือนกับ vector::begin() แต่ไม่มีความสามารถในการแก้ไของค์ประกอบต่างๆ
  • เวกเตอร์::cend(): มันทำงานเหมือนกับ vector::end() แต่ไม่สามารถแก้ไของค์ประกอบของเวกเตอร์ได้

ตัวอย่างต่อไปนี้จะเติมข้อมูลลงในเวกเตอร์ จากนั้นจึงวนลูปผ่านเวกเตอร์นั้นโดยใช้ตัววนซ้ำทั้งแบบเปลี่ยนแปลงได้และแบบคงที่

1 ตัวอย่าง

#include <iostream> 
#include <vector> 

using namespace std;
int main()
{
	vector<int> nums;

	for (int a = 1; a <= 5; a++)

		nums.push_back(a);

	cout << "Output from begin and end: ";

	for (auto a = nums.begin(); a != nums.end(); ++a)

		cout << *a << " ";

	cout << "\nOutput from cbegin and cend: ";

	for (auto a = nums.cbegin(); a != nums.cend(); ++a)

		cout << *a << " ";

	return 0;
}

Output:

C++ ตัวอย่างที่ 1 ผลลัพธ์ของตัววนซ้ำเวกเตอร์

นี่คือภาพหน้าจอของรหัส:

C++ ตัวอย่างโค้ดตัววนซ้ำเวกเตอร์ ตัวอย่างที่ 1

Code คำอธิบาย:

  1. รวมไฟล์ส่วนหัว iostream ไว้ในโค้ดของเรา มันจะช่วยให้เราอ่านและเขียนไปยังคอนโซลได้
  2. รวมไฟล์ส่วนหัวเวกเตอร์ไว้ในโค้ดของเรา มันจะช่วยให้เราทำงานกับเวกเตอร์ได้ C++.
  3. รวมเนมสเปซมาตรฐานเพื่อใช้คลาสและฟังก์ชันโดยไม่ต้องเรียกมัน
  4. เรียกใช้ฟังก์ชัน main() ภายในที่ควรเพิ่มตรรกะของโปรแกรม
  5. { เป็นจุดเริ่มต้นของส่วนเนื้อหาของฟังก์ชัน main()
  6. ประกาศเวกเตอร์ชื่อ nums เพื่อจัดเก็บชุดของจำนวนเต็ม
  7. สร้างลูป for เพื่อช่วยในการวนซ้ำผ่านเวกเตอร์ ตัวแปรจะช่วยให้เราวนซ้ำผ่านองค์ประกอบของเวกเตอร์ ตั้งแต่องค์ประกอบที่ 1 ถึงองค์ประกอบที่ 5
  8. ดันองค์ประกอบเข้าไปในเวกเตอร์ num จากด้านหลัง สำหรับการวนซ้ำแต่ละครั้ง ค่านี้จะเพิ่มค่าปัจจุบันของตัวแปร a ลงในเวกเตอร์ ซึ่งก็คือ 1 ถึง 5
  9. พิมพ์ข้อความบนคอนโซล
  10. ใช้ตัวแปรตัววนซ้ำ a เพื่อวนซ้ำองค์ประกอบของเวกเตอร์ nums ตั้งแต่ต้นจนจบองค์ประกอบที่ผ่านมา โปรดทราบว่าเรากำลังใช้ตัววนซ้ำ vector::begin() และ vector::end()
  11. พิมพ์ค่าที่ชี้ไปที่ตัวแปรตัววนซ้ำ a บนคอนโซลสำหรับการวนซ้ำแต่ละครั้ง
  12. พิมพ์ข้อความบนคอนโซล \n คืออักขระขึ้นบรรทัดใหม่ โดยเลื่อนเคอร์เซอร์ไปที่บรรทัดใหม่เพื่อพิมพ์จากตรงนั้น
  13. ใช้ตัวแปรอิเทอเรเตอร์เพื่อวนซ้ำองค์ประกอบของเวกเตอร์ nums ตั้งแต่ต้นจนถึงองค์ประกอบที่เลยจุดสิ้นสุดไปแล้ว โปรดสังเกตว่าเราใช้อิเทอเรเตอร์ vector::cbegin() และ vector::cend()
  14. พิมพ์ค่าที่ชี้ไปที่ตัวแปรตัววนซ้ำ a บนคอนโซลสำหรับการวนซ้ำแต่ละครั้ง
  15. ฟังก์ชั่นหลักควรส่งคืนค่าหากโปรแกรมทำงานได้สำเร็จ
  16. ส่วนท้ายของฟังก์ชัน main()

ตัวปรับเปลี่ยน

ตัวแก้ไขใช้สำหรับเปลี่ยนความหมายของประเภทข้อมูลที่ระบุ นี่คือตัวแก้ไขทั่วไปใน C++:

  • เวกเตอร์::push_back(): ตัวแก้ไขนี้จะผลักองค์ประกอบจากด้านหลัง
  • เวกเตอร์::แทรก(): สำหรับการแทรกรายการใหม่ลงในเวกเตอร์ในตำแหน่งที่ระบุ
  • เวกเตอร์::pop_back(): ตัวแก้ไขนี้จะลบองค์ประกอบเวกเตอร์ออกจากด้านหลัง
  • เวกเตอร์::ลบ(): ใช้สำหรับลบองค์ประกอบต่างๆ ออกจากตำแหน่งที่ระบุ
  • เวกเตอร์::ชัดเจน(): มันจะลบองค์ประกอบเวกเตอร์ทั้งหมด

ตัวอย่างต่อไปนี้จะนำตัวปรับแต่งเหล่านี้มาใช้ตามลำดับเพื่อดูว่าเวกเตอร์เปลี่ยนแปลงอย่างไร

2 ตัวอย่าง

#include <iostream>
#include <vector> 

using namespace std;
int main()
{
	vector<int> nums;
	
	nums.assign(5, 1);

	cout << "Vector contents: ";
	for (int a = 0; a < nums.size(); a++)
		cout << nums[a] << " ";

	nums.push_back(2);
	int n = nums.size();
	cout << "\nLast element: " << nums[n - 1];

	nums.pop_back();

	cout << "\nVector contents: ";
	for (int a = 0; a < nums.size(); a++)
		cout << nums[a] << " ";

	nums.insert(nums.begin(), 7);

	cout << "\nFirst element: " << nums[0];
	
	nums.clear();
	cout << "\nSize after clear(): " << nums.size();			
}

Output:

C++ ตัวอย่างที่ 2 เอาต์พุตของตัวแก้ไขเวกเตอร์

นี่คือภาพหน้าจอของรหัส:

C++ ตัวอย่างโค้ดตัวแก้ไขเวกเตอร์ ตัวอย่างที่ 2

Code คำอธิบาย:

  1. รวมไฟล์ส่วนหัว iostream ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
  2. รวมไฟล์ส่วนหัวเวกเตอร์ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
  3. รวมเนมสเปซมาตรฐานเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
  4. เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมเข้าไปในเนื้อความ
  5. จุดเริ่มต้นของฟังก์ชัน main()
  6. ประกาศเวกเตอร์ชื่อ nums เพื่อเก็บค่าจำนวนเต็ม
  7. เก็บ 5 องค์ประกอบไว้ในตัวเลขเวกเตอร์ แต่ละตัวมีค่าเท่ากับ 1
  8. พิมพ์ข้อความบนคอนโซล
  9. ใช้ตัวแปรตัววนซ้ำ a เพื่อวนซ้ำองค์ประกอบของเวกเตอร์ nums
  10. พิมพ์ค่าของ vector nums บนคอนโซลสำหรับการวนซ้ำแต่ละครั้ง
  11. เพิ่มค่า 2 ต่อท้ายตัวเลขเวกเตอร์
  12. ประกาศตัวแปรจำนวนเต็ม n เพื่อจัดเก็บขนาดของตัวเลขเวกเตอร์
  13. พิมพ์ค่าสุดท้ายของตัวเลขเวกเตอร์ควบคู่ไปกับข้อความอื่นๆ มันควรคืนค่า 2
  14. ลบองค์ประกอบสุดท้ายออกจากตัวเลขเวกเตอร์ 2 ตัวจะถูกลบออก
  15. พิมพ์ข้อความบนคอนโซล \n เลื่อนเคอร์เซอร์ไปที่บรรทัดใหม่เพื่อพิมพ์ข้อความที่นั่น
  16. ใช้ตัวแปรตัววนซ้ำ a เพื่อวนซ้ำองค์ประกอบของเวกเตอร์ nums
  17. พิมพ์ค่าของ vector nums บนคอนโซลสำหรับการวนซ้ำแต่ละครั้ง
  18. ใส่ค่า 7 ที่จุดเริ่มต้นของตัวเลขเวกเตอร์
  19. พิมพ์ค่าแรกของตัวเลขเวกเตอร์ควบคู่ไปกับข้อความอื่นๆ มันควรกลับมา 7
  20. ลบองค์ประกอบทั้งหมดออกจากตัวเลขเวกเตอร์
  21. พิมพ์ขนาดของเวกเตอร์ num ควบคู่ไปกับข้อความอื่นหลังจากล้างเนื้อหาทั้งหมดแล้ว มันควรส่งคืน 0
  22. ส่วนท้ายของฟังก์ชัน main()

ความจุ

ใช้สิ่งต่อไปนี้ ฟังก์ชั่น เพื่อกำหนดความจุของเวกเตอร์:

  • ขนาด() – ฟังก์ชันนี้จะส่งคืนจำนวนรายการในเวกเตอร์
  • Max_size() – ฟังก์ชันนี้จะส่งคืนจำนวนรายการสูงสุดที่เวกเตอร์สามารถจัดเก็บได้
  • ความจุ() – ฟังก์ชันนี้จะส่งคืนปริมาณพื้นที่จัดเก็บที่จัดสรรให้กับเวกเตอร์
  • ปรับขนาด() – ฟังก์ชันนี้จะปรับขนาดคอนเทนเนอร์ให้สามารถบรรจุรายการได้ n รายการ หากขนาดปัจจุบันของเวกเตอร์มากกว่า n รายการที่อยู่ด้านหลังจะถูกลบออกจากเวกเตอร์ หากขนาดปัจจุบันของเวกเตอร์น้อยกว่า n รายการเพิ่มเติมจะถูกเพิ่มเข้าไปที่ด้านหลังของเวกเตอร์
  • ว่างเปล่า() – ฟังก์ชันนี้จะคืนค่า true หากเวกเตอร์ว่างเปล่า และคืนค่า false หากเวกเตอร์ไม่ว่างเปล่า

ตัวอย่างสุดท้ายนี้แสดงการรายงานและปรับการจัดเก็บเวกเตอร์โดยใช้ฟังก์ชันความจุข้างต้น

3 ตัวอย่าง

#include <iostream> 
#include <vector> 
using namespace std;
int main() {
	vector<int> vector1;
	for (int x = 1; x <= 10; x++)
		vector1.push_back(x);
	cout << "Vector size: " << vector1.size()<< endl;
	cout << "Vector capacity: " << vector1.capacity() << endl;
	cout << "Maximum size of vector: " << vector1.max_size()<< endl;
	vector1.resize(5);
	cout << "Vector size after resizing: " << vector1.size() << endl;
	if (vector1.empty() == false)
		cout << "Vector is not empty"<<endl;
	else
		cout << "Vector is empty"<<endl;
	return 0;
}

Output:

C++ ความจุเวกเตอร์ ตัวอย่างผลลัพธ์ที่ 3

นี่คือภาพหน้าจอของรหัส:

C++ ความจุเวกเตอร์ ตัวอย่างโค้ด 3

Code คำอธิบาย:

  1. รวมไฟล์ส่วนหัว iostream ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชัน
  2. รวมไฟล์ส่วนหัวเวกเตอร์ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
  3. รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
  4. เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในเนื้อหาของฟังก์ชันนี้
  5. สร้างเวกเตอร์ชื่อ vector1 เพื่อเก็บจำนวนเต็ม
  6. ใช้ for loop เพื่อสร้างตัวแปร x ที่มีค่าตั้งแต่ 1 ถึง 10
  7. ผลักค่าของตัวแปร x เข้าไปในเวกเตอร์
  8. พิมพ์ขนาดของเวกเตอร์ควบคู่ไปกับข้อความอื่นๆ บนคอนโซล
  9. พิมพ์ความจุของเวกเตอร์ควบคู่ไปกับข้อความอื่นๆ บนคอนโซล
  10. พิมพ์จำนวนรายการสูงสุดที่เวกเตอร์สามารถเก็บไว้ข้างข้อความอื่นๆ บนคอนโซล
  11. ปรับขนาดเวกเตอร์ให้มีเพียง 5 องค์ประกอบเท่านั้น
  12. พิมพ์ขนาดใหม่ของเวกเตอร์ควบคู่ไปกับข้อความอื่น
  13. ตรวจสอบว่าเวกเตอร์ไม่ว่างเปล่า
  14. พิมพ์ข้อความบนคอนโซลหากเวกเตอร์ไม่ว่างเปล่า
  15. ใช้คำสั่ง else เพื่อระบุว่าต้องทำอย่างไรหากเวกเตอร์ว่างเปล่า
  16. ข้อความที่จะพิมพ์บนคอนโซลหากเวกเตอร์ว่างเปล่า
  17. โปรแกรมจะต้องคืนค่าเมื่อเสร็จสิ้นสำเร็จ
  18. จุดสิ้นสุดของเนื้อหาฟังก์ชัน main()

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

เวกเตอร์เป็นอาร์เรย์แบบไดนามิกที่ปรับขนาดตัวเองโดยอัตโนมัติและรู้ขนาดของตัวเอง ในขณะที่อาร์เรย์พื้นฐานมีขนาดคงที่ที่กำหนดไว้ในระหว่างการคอมไพล์ เวกเตอร์จะจัดการหน่วยความจำให้คุณ ในขณะที่อาร์เรย์พื้นฐานไม่สามารถทำได้

ใช้ตัวดำเนินการดัชนี เช่น nums[0] เพื่อการเข้าถึงโดยตรงที่รวดเร็ว ฟังก์ชันสมาชิก at() เช่น nums.at(0) ทำงานเช่นเดียวกัน แต่จะโยนข้อยกเว้น out_of_range เมื่อดัชนีไม่ถูกต้อง ทำให้ปลอดภัยกว่า

ประกาศเวกเตอร์ที่มีองค์ประกอบเป็นเวกเตอร์เช่นกัน ตัวอย่างเช่น เวกเตอร์ > ตาราง คุณสามารถกำหนดขนาดได้ด้วยตัวสร้างหรือการเพิ่มแถวเข้าไป เวกเตอร์ภายในแต่ละตัวสามารถขยายขนาดได้อย่างอิสระ ทำให้คุณได้เมทริกซ์ที่ยืดหยุ่นและปรับขนาดได้

เวกเตอร์จัดเก็บองค์ประกอบในหน่วยความจำที่ต่อเนื่องกันด้วยการเข้าถึงแบบสุ่มที่รวดเร็ว ในขณะที่ std::list เป็นลิสต์แบบเชื่อมโยงสองทางที่มีการแทรกหรือลบข้อมูลได้อย่างรวดเร็วในทุกตำแหน่ง แต่ไม่มีการเข้าถึงดัชนีโดยตรง เลือกใช้ตามรูปแบบการเข้าถึงของคุณ

รวมเฮดเดอร์ของอัลกอริทึมและเรียกใช้ std::sort โดยใช้ตัววนซ้ำ begin และ end เช่น sort(nums.begin(), nums.end()) การเรียงลำดับจะเป็นแบบจากน้อยไปมากโดยค่าเริ่มต้น หากต้องการเรียงลำดับ ให้ส่งตัวเปรียบเทียบแบบกำหนดเองหรือมากกว่านั้น () เพื่อเรียงลำดับจากมากไปน้อย

ใช่ เวกเตอร์เป็นแม่แบบและสามารถเก็บค่าได้ทุกประเภท รวมถึงสตริง คลาสที่กำหนดเอง และแม้แต่เวกเตอร์อื่นๆ ให้ประกาศประเภทขององค์ประกอบภายในวงเล็บเหลี่ยม เช่น vector หรือเวกเตอร์ .

ใช่แล้ว ผู้ช่วยเขียนโค้ด AI จะแปลงข้อความแจ้งหรือความคิดเห็นสั้นๆ ให้เป็นโค้ดเวกเตอร์ที่ใช้งานได้จริง รวมถึงการประกาศตัวแปร ลูป push_back และการวนซ้ำ ควรตรวจสอบประเภท ขอบเขต และการจัดการความจุที่แนะนำเสมอ เนื่องจาก AI อาจมองข้ามข้อกำหนดเฉพาะของโครงการได้

ใช่. นักบิน GitHub โปรแกรมนี้แนะนำการประกาศเวกเตอร์ การเรียกใช้ push_back และ insert และลูป iterator ขณะที่คุณพิมพ์ มันจัดการกับโค้ดซ้ำซ้อนได้ดี แต่คุณควรตรวจสอบดัชนี การปรับขนาด และตรรกะก่อนคอมไพล์อยู่ดี

สรุปโพสต์นี้ด้วย: