- ใช้ได้กับภาษา C++ เท่านั้น
- Standard Template Library (C++) คือชุดฟังก์ชันและโครงสร้างข้อมูลที่ภาษา C++ เตรียมไว้ให้
- ในที่นี้ จะอธิบาย
vector,mapและmultimapvectorคือ array แต่มีการจัดการเรื่องขนาดของ array ให้อัตโนมัติmapใช้สำหรับเก็บค่า โดยอ้างอิงจากค่าชนิดหนึ่ง (key) ไปยังอีกค่าชนิดนึง (value) แทนที่จะใช้ตัวเลข index แบบ arraymultimapเหมือน map แต่ key นึง อาจมีได้หลาย value
- ต้อง
#include <vector>และusing namespace std; vectorเป็นคลาสในภาษา C++ ทีควบคุมการสร้าง array การปรับขนาด และการเข้าถึงข้อมูลให้โดยอัตโนมัติ- สามารถสร้าง
vectorได้ในรูปแบบvector<Type> variableName;เช่นvector<int> studentID; - หรือสร้างแบบ
vector<Type> variableName(anotherVector)เพื่อเลียนแบบvectorที่ใส่เข้ามา - หรือสร้างแบบ
vector<Type> variableName(first, last)เพื่อสร้างจาก vector, map, array, etc. ในช่วง first ถึง last- last จะต้องอยู่เกินตำแหน่งสุดท้ายไป 1 ตำแหน่ง
- หากเป็น array โดยทั่วไปจะใส่ pointer ตัวแรก (ตัว array) เอง และ pointer ที่บวกด้วยขนาด array (จะอยู่เกินไป 1 ตำแหน่งพอดี)
ตัวอย่าง
// สร้าง vector ว่าง
vector<int> students;
// สร้าง vector จาก array
int studentArray = { 4, 8, 15, 16, 23, 42 };
vector<int> newStudents(studentArray, studentArray + 6);
// สร้าง vector จาก vector อื่น
vector<int> oldStudents(newStudents);- การเรียกใช้ฟังก์ชัน เขียนในรูป
variableName.functionName(arg1, arg2, ...)
- ฟังก์ชัน
begin,end,rbegin,rendเป็นฟังก์ชันที่ให้ iterator สำหรับ loop สมาชิกทุกตัว- iterator คือตัวช่วยในการเข้าถึงสมาชิกแต่ละตัว ดูในหัวข้อถัดไป
beginให้ตำแหน่งตัวแรก ส่วนendให้ตำแหน่งหลังตัวสุดท้าย 1 ตัวrbeginให้ตำแนห่งตัวสุดท้าย ส่วนrendให้ตำแนห่งตัวก่อนตัวแรก 1 ตัว- ดูตัวอย่างได้ที่หัวข้อถัดไป
-
ฟังก์ชัน
sizeไว้สำหรับดูขนาดของvector- เช่น
cout << "There are " << studentID.size() << " students.";
- เช่น
-
ฟังก์ชัน
emptyไว้สำหรับดูว่าvectorว่างหรือไม่- เช่น
if (studentID.empty()) { cout << "There are no students."; }
- เช่น
-
สามารถเข้าถึงสมาชิกของ vector ได้แบบเดียวกันกับ array
- แต่เข้าถึงได้มากสุด เท่าที่มีอยู่ใน vector เท่านั้น หากต้องการเพิ่มต่อท้ายต้องใช้
push_back - เช่น
studentID[0] = 0;(เปลี่ยน studentID ที่ตำแหน่งแรกให้เป็น 0)
- แต่เข้าถึงได้มากสุด เท่าที่มีอยู่ใน vector เท่านั้น หากต้องการเพิ่มต่อท้ายต้องใช้
-
ฟังก์ชัน
frontและbackมีไว้สำหรับเข้าถึงสมาชิกตัวแรกและตัวสุดท้าย- เช่น
cout << studentID.front();(0)
- เช่น
-
ฟังก์ชัน
atใช้เหมือนกันวงเล็บเหลี่ยมของ arraystudentID.at(0) = 0;
-
ฟังก์ชัน
push_backมีไว้สำหรับเพิ่มสมาชิกต่อท้ายvector- เช่น
studentID.push_back(44677);
- เช่น
-
ฟังก์ชัน
pop_backมีไว้สำหรับลบสมาชิกตัวสุดท้าของvector- เช่น
studentID.pop_back();
- เช่น
-
ฟังก์ชัน
insertมีไว้สำหรับแทรกสมาชิกเข้าไปก่อนหน้าตำแหน่งที่เราต้องการ-
แบบแรก
insert(position, value)position คือ iterator ตำแหน่งที่ต้องการ และ value คือค่าที่ต้องการแทรก -
แบบที่สอง
insert(position, n, value)คล้ายกับแบบข้างบน แต่จะแทรก value ทั้งหมด n ตัว -
แบบที่สาม
insert(position, first, last)เมื่อ first และ last คือ iterator ของอีก vector, map, array, etc. (last จะอยู่ตำแหน่งเกินตัวสุดท้าย 1 ตัว) มีไว้เพื่อแทรกช่วง first ถึง last ก่อนหน้าตำแหน่ง position -
เช่น
studentID.insert(studentID.begin() + 3, 42);จะเพิ่มเลข 42 ไปที่ตำแหน่ง index 3 -
studentID.insert(studentID.begin(), 5, 555);เพิ่มเลข 555 เข้าไป 5 ตัวที่ตำแหน่งแรก -
studentID.insert(studentID.begin() + 2, studentArray, studentArray + 6);แทรกทั้ง array จากตัวอย่างหัวข้อที่แล้ว เริ่มที่ตำแหน่ง index 2
-
- สามารถเข้าถึงสมาชิกทุกตัวใน
vectorได้สองวิธี - วิธีแรกคือการเข้าถึงแบบ array
for (int i = 0; i < studentID.size(); i++)
cout << studentID[i] << endl;- อีกวิธีหนึ่งคือการใช้ iterator โดย iterator จะมีลักษณะคล้ายๆ กับ pointer
- เฉพาะมาตรฐาน C++11 ขึ้นไป ไม่จำเป็นต้องระบุชนิด iterator สามารถพิมพ์
autoได้เลย
// it เป็นตัวแปรชนิด vector<int>::iterator ซึ่งมีลักษณะคล้ายๆ pointer
// สามารถเข้าถึงสมาชิกได้โดยพิมพ์ asterisk * ข้างหน้า
// เมื่อต้องการเคลื่อนไปตัวถัดไปสามารถใช้ it++ ได้เหมือน pointer
// loop จะหยุดทำงานเมื่อ loop ถึงตำแหน่งที่เกินตัวสุดท้าย (`studentID.end()`)
for (auto it = studentID.begin(); it != studentID.end(); ++it)
cout << *it << endl;
// loop ย้อนหลัง
for (Auto it = studentID.rbegin(); it != studentID.rend(); ++it)
cout << *it << endl;- เฉพาะมาตรฐาน C++11 ขึ้นไป สามารถ loop สมาชิกทุกตัวได้โดยใช้ range-based loop
for (auto std : studentID)
cout << std << endl;