บทนำ
อาร์เรย์คือชุดของประเภทอ็อบเจ็กต์เดียวกันในตำแหน่งหน่วยความจำที่ต่อเนื่องกัน อาร์เรย์ไม่สามารถเพิ่มแร่ลดความยาวได้ เวกเตอร์เป็นเหมือนอาร์เรย์ แต่สามารถเพิ่มหรือลดความยาวของมันได้ เวกเตอร์จึงมีการดำเนินการมากกว่าอาร์เรย์
C++ มีไลบรารีจำนวนมาก ซึ่งทั้งหมดนี้เป็นไลบรารีมาตรฐาน C++ หนึ่งในไลบรารีเหล่านี้คือไลบรารีคอนเทนเนอร์ คอนเทนเนอร์คือคอลเล็กชันของออบเจ็กต์ และการดำเนินการบางอย่างสามารถดำเนินการกับคอลเล็กชันได้ คอนเทนเนอร์ C++ สามารถจัดกลุ่มเป็นสองชุด: คอนเทนเนอร์ตามลำดับและคอนเทนเนอร์ที่เชื่อมโยง คอนเทนเนอร์ลำดับคือเวกเตอร์, อาร์เรย์ (ไม่ใช่อาร์เรย์เดียวกันกับที่กล่าวถึงก่อนหน้านี้), deque, forward_list และรายการ เหล่านี้เป็นคอลเลกชันที่แตกต่างกัน (โครงสร้างข้อมูลที่เหมือนอาร์เรย์) และแต่ละรายการมีการแลกเปลี่ยนที่แตกต่างกัน
โปรแกรมเมอร์ทุกคนควรรู้วิธีตัดสินใจว่าจะใช้เวกเตอร์, อาร์เรย์, deque, forward_list หรือรายการ เมื่อโปรแกรมเมอร์ต้องการโครงสร้างที่ต้องการการดำเนินการมากกว่าที่เกี่ยวข้องกับอาร์เรย์ทั่วไป ไม่ควรใช้อาร์เรย์ธรรมดา
หากงานเกี่ยวข้องกับการแทรกและการลบบ่อยครั้งที่ตรงกลางของลำดับ ควรใช้รายการหรือรายการส่งต่อ หากงานเกี่ยวข้องกับการแทรกและการลบบ่อยครั้งในตอนต้นหรือตอนท้ายของลำดับ ควรใช้ deque ควรใช้เวกเตอร์เมื่อไม่ต้องการการดำเนินการประเภทนี้
บทความนี้แสดงวิธีใช้เวกเตอร์ C++ คุณจะต้องมีความรู้เกี่ยวกับพอยน์เตอร์ C++ การอ้างอิง และอาร์เรย์เพื่อทำความเข้าใจบทความนี้
คลาสและวัตถุ
คลาสคือชุดของตัวแปรและฟังก์ชันที่ทำงานร่วมกัน โดยที่ตัวแปรไม่ได้กำหนดค่าไว้ เมื่อกำหนดค่าให้กับตัวแปร คลาสจะกลายเป็นวัตถุ ค่าต่าง ๆ ที่มอบให้กับคลาสเดียวกันส่งผลให้เกิดอ็อบเจกต์ต่างกัน กล่าวคือ ออบเจ็กต์ที่แตกต่างกันสามารถเป็นคลาสเดียวกันได้ แต่มีค่าต่างกัน การสร้างวัตถุจากคลาสเรียกอีกอย่างว่าการสร้างอินสแตนซ์ของวัตถุ
คำว่า vector อธิบายคลาส วัตถุที่สร้างจากเวกเตอร์มีชื่อที่โปรแกรมเมอร์เลือกไว้
จำเป็นต้องใช้ฟังก์ชันที่เป็นของคลาสเพื่อสร้างอินสแตนซ์ของอ็อบเจ็กต์จากคลาส ใน C++ ฟังก์ชันนั้นมีชื่อเดียวกับชื่อของคลาส ออบเจ็กต์ต่างๆ ที่สร้าง (ทันที) จากคลาสมีชื่อเฉพาะที่โปรแกรมเมอร์กำหนดให้กับแต่ละรายการ
การสร้างวัตถุจากคลาสหมายถึงการสร้างวัตถุ นอกจากนี้ยังหมายถึงการสร้างอินสแตนซ์ของวัตถุ
The Vector Class
มีการกำหนดคลาสเวกเตอร์แล้วและอยู่ในไลบรารี ในการใช้คลาสเวคเตอร์ โปรแกรมเมอร์ต้องรวมส่วนหัวเวกเตอร์ในไฟล์ด้วยคำสั่งประมวลผลล่วงหน้าต่อไปนี้:
#รวมเมื่อรวมส่วนหัวแล้ว คุณลักษณะเวกเตอร์ทั้งหมด (สมาชิกข้อมูลและฟังก์ชันของสมาชิก) จะสามารถเข้าถึงได้ ในการใช้อ็อบเจ็กต์การนับเพื่อส่งออกข้อมูลไปยังเทอร์มินัล (คอนโซล) จะต้องรวมส่วนหัวของอ็อบเจ็กต์ด้วย ในการเขียนโปรแกรมด้วยเวกเตอร์ อย่างน้อย ต้องมีส่วนหัวต่อไปนี้:
#รวม#รวม
การสร้างอินสแตนซ์เวกเตอร์
intฟู[10];ด้านบนเป็นการประกาศอาร์เรย์ที่มีชื่อ foo และจำนวนองค์ประกอบ 10 นี่คืออาร์เรย์ของจำนวนเต็ม การประกาศเวกเตอร์นั้นคล้ายคลึงกัน สำหรับเวกเตอร์ จำนวนองค์ประกอบเป็นทางเลือก เนื่องจากความยาวเวกเตอร์สามารถเพิ่มหรือลดลงได้
ณ จุดนี้ในโปรแกรม คลาสเวกเตอร์ถูกกำหนดไว้แล้วในไลบรารี และรวมส่วนหัวแล้ว เวกเตอร์สามารถยกตัวอย่างได้ดังนี้:
ชั่วโมง::เวกเตอร์ <int>vtr(8);ในที่นี้ เวกเตอร์เป็นของฟังก์ชันตัวสร้างพิเศษ ประเภทของข้อมูลที่เวกเตอร์จะเก็บเป็น int ในวงเล็บมุม คำว่า vtr คือชื่อที่เลือกโดยโปรแกรมเมอร์สำหรับเวกเตอร์ สุดท้าย 8 ในวงเล็บ คือจำนวนเต็มที่เบื้องต้นที่เวกเตอร์จะมี
คำว่า std หมายถึงเนมสเปซมาตรฐาน คำนี้ต้องตามด้วยโคลอนคู่ในบริบทนี้ ทุกคนสามารถเขียนไลบรารีคลาสเวกเตอร์ของตนเองและใช้งานได้ อย่างไรก็ตาม C++ มีไลบรารีมาตรฐานที่มีชื่อมาตรฐานอยู่แล้ว รวมถึงเวกเตอร์ด้วย หากต้องการใช้ชื่อมาตรฐาน ชื่อมาตรฐานต้องนำหน้าด้วย std:: เพื่อหลีกเลี่ยงการพิมพ์ std:: แต่ละครั้งในโปรแกรมสำหรับชื่อมาตรฐาน ไฟล์โปรแกรมสามารถเริ่มต้นได้ดังนี้:
#รวม#รวม
ใช้เนมสเปซ std;
โอเวอร์โหลดฟังก์ชัน
เมื่อลายเซ็นของฟังก์ชันที่แตกต่างกันตั้งแต่สองรายการขึ้นไปมีชื่อเหมือนกัน แสดงว่าชื่อนั้นโอเวอร์โหลด เมื่อเรียกใช้ฟังก์ชันหนึ่งฟังก์ชัน จำนวนและประเภทของอาร์กิวเมนต์จะเป็นตัวกำหนดฟังก์ชันที่จะดำเนินการ
การสร้างเวกเตอร์
การสร้างเวกเตอร์หมายถึงการสร้างอินสแตนซ์ (การสร้าง) วัตถุเวกเตอร์ ฟังก์ชันคอนสตรัคเตอร์โอเวอร์โหลดดังนี้:
ชื่อเวกเตอร์
สิ่งนี้จะสร้างเวกเตอร์ที่มีความยาวเป็นศูนย์และพิมพ์ T คำสั่งต่อไปนี้จะสร้างเวกเตอร์ที่มีความยาวเป็นศูนย์ของประเภท float ที่มีชื่อ vtr:
เวกเตอร์<ลอย>vtr;ชื่อเวกเตอร์ (n)
สิ่งนี้สร้างเวกเตอร์ที่มีองค์ประกอบ n ประเภท T คำสั่งสำหรับเวกเตอร์นี้ที่มีองค์ประกอบลอยสี่รายการมีดังนี้:
เวกเตอร์<ลอย>vtr(4);ชื่อเวกเตอร์ (n, t)
สิ่งนี้สร้างเวกเตอร์ขององค์ประกอบ n ที่เริ่มต้นเป็นค่า t คำสั่งต่อไปนี้สร้างเวกเตอร์ขององค์ประกอบ 5 โดยที่แต่ละองค์ประกอบมีค่า 3.4:
เวกเตอร์<ลอย>vtr(5, 3.4);การสร้างด้วยการเริ่มต้น
สามารถสร้าง (สร้าง) และเริ่มต้นเวกเตอร์ได้ในเวลาเดียวกัน โดยใช้วิธีใดวิธีหนึ่งจากสองวิธีต่อไปนี้:
เวกเตอร์<ลอย>vtr= {1.1, 2.2, 3.3, 4.4};หรือ
เวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};โปรดทราบว่าไม่มีวงเล็บอยู่หลังชื่อวัตถุ วงเล็บที่ใช้หลังชื่ออ็อบเจ็กต์ควรมีรายการตัวเริ่มต้นดังนี้:
เวกเตอร์<ลอย>vtr({1.1, 2.2, 3.3, 4.4});สามารถสร้างเวกเตอร์และเริ่มต้นได้ในภายหลังด้วยรายการตัวเริ่มต้น ในกรณีนี้จะไม่ใช้วงเล็บ:
เวกเตอร์<ลอย>vtr;vtr= {1.1, 2.2, 3.3, 4.4};
เวกเตอร์ V2 (V1)
นี่คือตัวสร้างสำเนา มันสร้างเวกเตอร์ V2 เป็นสำเนาของเวกเตอร์ V1 รหัสต่อไปนี้แสดงให้เห็นสิ่งนี้:
เวกเตอร์<ลอย>vtr1(5, 3.4);เวกเตอร์<ลอย>vtr2(vtr1);
การกำหนดเวกเตอร์ระหว่างการก่อสร้าง
ในระหว่างการก่อสร้าง สามารถสร้างเวกเตอร์เปล่าได้ในขณะที่อีกอันหนึ่งถูกกำหนดให้กับเวกเตอร์นั้น ดังนี้:
เวกเตอร์<ลอย>vtr1{1.1, 2.2, 3.3, 4.4};เวกเตอร์<ลอย>vtr2=vtr1;
คำสั่งที่สองเทียบเท่ากับ:
เวกเตอร์<ลอย>vtr2= {1.1, 2.2, 3.3, 4.4};const Vector
const vector คือเวกเตอร์ที่องค์ประกอบไม่สามารถเปลี่ยนแปลงได้ ค่าในเวกเตอร์นี้เป็นแบบอ่านอย่างเดียว เมื่อสร้าง เวกเตอร์จะปรากฏดังนี้:
constเวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};ในประเภทเวกเตอร์นี้ ไม่สามารถเพิ่มหรือลบองค์ประกอบใดๆ ได้ นอกจากนี้ยังไม่สามารถเปลี่ยนแปลงค่าได้
การสร้างด้วย Iterator
เทมเพลตให้การแสดงทั่วไปสำหรับชนิดข้อมูล ตัววนซ้ำให้การแสดงทั่วไปของการสแกนผ่านค่าของคอนเทนเนอร์ ไวยากรณ์ในการสร้างเวกเตอร์ด้วยตัววนซ้ำมีดังนี้:
แม่แบบ<คลาส InputIterator>เวกเตอร์(InputIterator ก่อน,InputIterator ล่าสุด,constตัวจัดสรร& =ตัวจัดสรร());
สิ่งนี้สร้างเวกเตอร์สำหรับช่วง [ก่อน ท้ายสุด) โดยใช้ตัวจัดสรรที่ระบุ ซึ่งจะกล่าวถึงในบทความนี้ต่อไป
ทำลายเวกเตอร์
ในการทำลายเวกเตอร์ เพียงแค่ปล่อยให้มันหลุดจากขอบเขตและทำลายจะได้รับการจัดการโดยอัตโนมัติ
ความจุเวกเตอร์
size_type ความจุ () const noexcept
จำนวนองค์ประกอบทั้งหมดที่เวกเตอร์สามารถเก็บได้โดยไม่ต้องมีการจัดสรรใหม่จะถูกส่งคืนโดยฟังก์ชันสมาชิกความจุ ส่วนรหัสสำหรับสิ่งนี้มีดังนี้:
เวกเตอร์<ลอย>vtr(4);intหนึ่ง=วีทีอาร์ความจุ();
ค่าใช้จ่าย<<หนึ่ง<< 'NS';
ผลลัพธ์คือ 4
สำรอง(n)
พื้นที่หน่วยความจำอาจไม่ว่างเสมอไป สามารถจองพื้นที่เพิ่มเติมล่วงหน้า พิจารณาส่วนรหัสต่อไปนี้:
เวกเตอร์<ลอย>vtr(4);วีทีอาร์จอง(6);
ค่าใช้จ่าย<<วีทีอาร์ความจุ() << 'NS';
ผลลัพธ์คือ 6 ดังนั้น พื้นที่พิเศษที่สงวนไว้คือ 6 – 4 = 2 องค์ประกอบ ฟังก์ชันส่งคืนเป็นโมฆะ
ขนาด() const noexcept
ส่งคืนจำนวนองค์ประกอบในเวกเตอร์ รหัสต่อไปนี้แสดงฟังก์ชันนี้:
เวกเตอร์<ลอย>vtr(4);ลอยNS=วีทีอาร์ขนาด();
ค่าใช้จ่าย<<NS<< 'NS';
ผลลัพธ์คือ 4
Shrink_to_fit()
หลังจากที่เพิ่มความจุให้กับเวกเตอร์ด้วยฟังก์ชัน Reserve() แล้ว เวกเตอร์สามารถย่อขนาดลงเพื่อให้พอดีกับขนาดดั้งเดิมได้ รหัสต่อไปนี้แสดงให้เห็นสิ่งนี้:
เวกเตอร์<ลอย>vtr(4);วีทีอาร์จอง(6);
วีทีอาร์หด_to_fit();
intNS=วีทีอาร์ขนาด();
ค่าใช้จ่าย<<NS<< 'NS';
เอาต์พุตคือ 4 ไม่ใช่ 6 ฟังก์ชันจะคืนค่าเป็นโมฆะ
ปรับขนาด (sz), ปรับขนาด (sz, c)
สิ่งนี้จะปรับขนาดเวกเตอร์ หากขนาดใหม่มีขนาดเล็กกว่าขนาดเดิม องค์ประกอบที่อยู่ตรงส่วนท้ายจะถูกลบออก หากขนาดใหม่ยาวขึ้น ค่าเริ่มต้นบางส่วนจะถูกเพิ่มในตอนท้าย หากต้องการเพิ่มค่าเฉพาะ ให้ใช้ฟังก์ชัน resize() ที่มีสองอาร์กิวเมนต์ ส่วนรหัสต่อไปนี้แสดงให้เห็นถึงการใช้ฟังก์ชันทั้งสองนี้:
เวกเตอร์<ลอย>vtr1{1.1, 2.2, 3.3, 4.4};vtr1.ปรับขนาด(2);
ค่าใช้จ่าย<< 'ขนาดใหม่ของ vtr1: ' <<vtr1.ขนาด() << 'NS';
เวกเตอร์<ลอย>vtr2{1.1, 2.2};
วีทีอาร์2ปรับขนาด(4, 8.8);
ค่าใช้จ่าย<< 'vtr2:'<<vtr2[0] <<''<<vtr2[1] <<'
'<<vtr2[2] <<''<<vtr2[3] << 'NS';
ผลลัพธ์มีดังต่อไปนี้:
ขนาดใหม่ของ vtr1: 2vtr2: 1.1 2.2 8.8 8.8
ฟังก์ชั่นส่งคืนเป็นโมฆะ
ว่างเปล่า () const noexcept
ฟังก์ชันนี้จะคืนค่า 1 สำหรับค่า true หากไม่มีองค์ประกอบในเวกเตอร์ และ 0 สำหรับค่า false หากเวกเตอร์ว่าง หากเวกเตอร์มีตำแหน่ง 4 ตำแหน่งสำหรับข้อมูลบางประเภท เช่น float โดยไม่มีค่า float เวกเตอร์นั้นจะไม่ว่างเปล่า รหัสต่อไปนี้แสดงให้เห็นสิ่งนี้:
เวกเตอร์<ลอย>vtr;ค่าใช้จ่าย<<วีทีอาร์ว่างเปล่า() << 'NS';
เวกเตอร์<ลอย>vt(4);
ค่าใช้จ่าย<<ดังนั้นว่างเปล่า() << 'NS';
เวกเตอร์<ลอย>วี(4,3.5);
ค่าใช้จ่าย<<วีว่างเปล่า() << 'NS';
ผลลัพธ์มีดังต่อไปนี้:
10
0
การเข้าถึงองค์ประกอบเวกเตอร์
เวกเตอร์สามารถ sub-scripted (จัดทำดัชนี) เหมือนอาร์เรย์ การนับดัชนีเริ่มจากศูนย์
vectorName[ผม]
การดำเนินการ vectorName[i] คืนค่าการอ้างอิงไปยังองค์ประกอบที่iNSดัชนีของเวกเตอร์ รหัสต่อไปนี้แสดงผล 3.3 สำหรับเวกเตอร์ด้านบน:
เวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};ลอยฟล=vtr[2];
ค่าใช้จ่าย<<ฟล<< 'NS';
vectorName[i] const
การดำเนินการ vectorName[i] const ถูกดำเนินการแทน vectorName[i] เมื่อเวกเตอร์เป็นเวกเตอร์คงที่ การดำเนินการนี้ใช้ในรหัสต่อไปนี้:
constเวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};ลอยฟล=vtr[2];
ค่าใช้จ่าย<<ฟล<< 'NS';
นิพจน์ส่งคืนการอ้างอิงคงที่ไปยังiNSองค์ประกอบของเวกเตอร์
การกำหนดค่าด้วยการสมัคร
สามารถกำหนดค่าให้กับเวกเตอร์ที่ไม่คงที่ได้ดังนี้:
เวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};vtr[2] = 8.8;
ค่าใช้จ่าย<<vtr[2] << 'NS';
เอาต์พุตคือ 8.8
vectorName.at(ผม)
vectorName.at(i) เหมือนกับ vectorName[i] แต่ vectorName.at(i) น่าเชื่อถือกว่า รหัสต่อไปนี้แสดงให้เห็นว่าควรใช้เวกเตอร์นี้อย่างไร:
เวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};ลอยฟล=วีทีอาร์ที่(2);
ค่าใช้จ่าย<<ฟล<< 'NS';
ที่()เป็นสมาชิกเวกเตอร์การทำงาน.
vectorName.at(i) const
vectorName.at(i) const เหมือนกับ vectorName[i] const แต่ vectorName.at(i) const มีความน่าเชื่อถือมากกว่า vectorName.at(i) const ถูกดำเนินการแทน vectorName.at(i) เมื่อเวกเตอร์เป็นเวกเตอร์คงที่ เวกเตอร์นี้ใช้ในรหัสต่อไปนี้:
constเวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};ลอยฟล=วีทีอาร์ที่(2);
ค่าใช้จ่าย<<ฟล<< 'NS';
ที่() constเป็นสมาชิกเวกเตอร์การทำงาน.
การกำหนดค่าด้วยฟังก์ชัน at()
สามารถกำหนดค่าให้กับเวกเตอร์ที่ไม่คงที่ด้วยฟังก์ชัน at() ได้ดังนี้:
เวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};วีทีอาร์ที่(2) = 8.8;
ค่าใช้จ่าย<<vtr[2] << 'NS';
เอาต์พุตคือ 8.8
ปัญหาเกี่ยวกับการเขียนสคริปต์ย่อย
ปัญหาเกี่ยวกับ sub-scripting (การทำดัชนี) คือถ้าดัชนีอยู่นอกช่วง ค่าศูนย์อาจถูกส่งคืนหรือข้อผิดพลาดอาจเกิดขึ้นในขณะใช้งาน
ด้านหน้า()
ส่งคืนการอ้างอิงไปยังองค์ประกอบแรกของเวกเตอร์โดยไม่ต้องลบองค์ประกอบ ผลลัพธ์ของรหัสต่อไปนี้คือ 1.1
เวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};ลอยฟล=วีทีอาร์ด้านหน้า();
ค่าใช้จ่าย<<ฟล<< 'NS';
องค์ประกอบไม่ถูกลบออกจากเวกเตอร์
front() const
เมื่อการสร้างเวกเตอร์นำหน้าด้วย const นิพจน์ front() const จะถูกดำเนินการแทน front() ใช้ในรหัสต่อไปนี้:
constเวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};ลอยฟล=วีทีอาร์ด้านหน้า();
ค่าใช้จ่าย<<ฟล<< 'NS';
การอ้างอิงคงที่จะถูกส่งกลับ องค์ประกอบไม่ถูกลบออกจากเวกเตอร์
กลับ()
ส่งคืนการอ้างอิงไปยังองค์ประกอบสุดท้ายของเวกเตอร์โดยไม่ต้องลบองค์ประกอบ ผลลัพธ์ของรหัสต่อไปนี้คือ 4.4
เวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};ลอยฟล=วีทีอาร์กลับ();
ค่าใช้จ่าย<<ฟล<< 'NS';
back() const
เมื่อการสร้างเวกเตอร์นำหน้าด้วย const นิพจน์ back() const จะถูกดำเนินการแทน back() ใช้ในรหัสต่อไปนี้:
constเวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};ลอยฟล=วีทีอาร์กลับ();
ค่าใช้จ่าย<<ฟล<< 'NS';
การอ้างอิงคงที่จะถูกส่งกลับ องค์ประกอบไม่ถูกลบออกจากเวกเตอร์
การเข้าถึงข้อมูลเวกเตอร์
data() ไม่มียกเว้น; data() const noexcept;
อย่างใดอย่างหนึ่งเหล่านี้ส่งคืนตัวชี้เช่นว่า [data(), data() + size()) เป็นช่วงที่ถูกต้อง
ซึ่งจะกล่าวถึงรายละเอียดเพิ่มเติมในบทความต่อไป
การส่งคืน Iterators และ Vector
ตัววนซ้ำเป็นเหมือนตัวชี้ แต่มีฟังก์ชันมากกว่าตัวชี้
เริ่มต้น () ไม่มีข้อยกเว้น
ส่งกลับตัววนซ้ำที่ชี้ไปที่องค์ประกอบแรกของเวกเตอร์ ดังในส่วนของโค้ดต่อไปนี้:
เวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};เวกเตอร์<ลอย> ::iteratoriter=วีทีอาร์เริ่ม();
ค่าใช้จ่าย<< *iter<< 'NS';
ผลลัพธ์คือ 1.1 โปรดทราบว่าการประกาศที่ได้รับ iterator ได้รับการประกาศแล้ว ตัววนซ้ำจะถูกยกเลิกการอ้างอิงในนิพจน์การส่งคืนเพื่อรับค่าในลักษณะเดียวกับที่ตัวชี้ถูกเลิกอ้างอิง
start() const noexcept;
ส่งกลับตัววนซ้ำที่ชี้ไปที่องค์ประกอบแรกของเวกเตอร์ เมื่อการสร้างเวกเตอร์นำหน้าด้วย const นิพจน์ begin() const จะถูกดำเนินการแทน start() ภายใต้เงื่อนไขนี้ องค์ประกอบที่เกี่ยวข้องในเวกเตอร์ไม่สามารถแก้ไขได้ ใช้ในรหัสต่อไปนี้:
constเวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};เวกเตอร์<ลอย> ::const_iteratoriter=วีทีอาร์เริ่ม();
ค่าใช้จ่าย<< *iter<< 'NS';
ผลลัพธ์คือ 1.1 โปรดทราบว่าครั้งนี้มีการใช้ const_iterator แทนตัววนซ้ำเพื่อรับตัววนซ้ำที่ส่งคืน
end() noexcept
ส่งกลับตัววนซ้ำที่ชี้ทันทีเกินองค์ประกอบสุดท้ายของเวกเตอร์ พิจารณาส่วนรหัสต่อไปนี้:
เวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};เวกเตอร์<ลอย> ::iteratoriter=วีทีอาร์จบ();
ค่าใช้จ่าย<< *iter<< 'NS';
ผลลัพธ์คือ 0 ซึ่งไม่มีความหมาย เนื่องจากไม่มีองค์ประกอบที่เป็นรูปธรรมนอกเหนือจากองค์ประกอบสุดท้าย
end() const noexcept
ส่งกลับตัววนซ้ำที่ชี้ทันทีเกินองค์ประกอบสุดท้ายของเวกเตอร์ เมื่อการสร้างเวกเตอร์นำหน้าด้วย const นิพจน์ end() const จะถูกดำเนินการแทน end() พิจารณาส่วนรหัสต่อไปนี้:
constเวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};เวกเตอร์<ลอย> ::const_iteratoriter=วีทีอาร์จบ();
ค่าใช้จ่าย<< *iter<< 'NS';
ผลลัพธ์คือ 0 โปรดทราบว่าครั้งนี้มีการใช้ const_iterator แทนตัววนซ้ำเพื่อรับตัววนซ้ำที่ส่งคืน
การวนซ้ำแบบย้อนกลับ
เป็นไปได้ที่จะมีตัววนซ้ำที่วนซ้ำจากจุดสิ้นสุดจนถึงก่อนองค์ประกอบแรก
rbegin() ไม่มีข้อยกเว้น
ส่งกลับตัววนซ้ำที่ชี้ไปที่องค์ประกอบสุดท้ายของเวกเตอร์ เช่นเดียวกับในส่วนของโค้ดต่อไปนี้:
เวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};เวกเตอร์<ลอย> ::reverse_iteratorไรเตอร์=วีทีอาร์rbegin();
ค่าใช้จ่าย<< *ไรเตอร์<< 'NS';
เอาต์พุตคือ 4.4
โปรดทราบว่ามีการประกาศการประกาศที่ได้รับตัววนซ้ำแบบย้อนกลับ ตัววนซ้ำจะถูกยกเลิกการอ้างอิงในนิพจน์การส่งคืนเพื่อรับค่าในลักษณะเดียวกับที่ตัวชี้ถูกเลิกอ้างอิง
rbegin() const noexcept;
ส่งกลับตัววนซ้ำที่ชี้ไปที่องค์ประกอบสุดท้ายของเวกเตอร์ เมื่อการสร้างเวกเตอร์นำหน้าด้วย const นิพจน์ rbegin() const จะถูกดำเนินการแทน rbegin() ภายใต้เงื่อนไขนี้ องค์ประกอบที่เกี่ยวข้องในเวกเตอร์ไม่สามารถแก้ไขได้ คุณลักษณะนี้ใช้ในรหัสต่อไปนี้:
constเวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};เวกเตอร์<ลอย> ::const_reverse_iteratorไรเตอร์=วีทีอาร์rbegin();
ค่าใช้จ่าย<< *ไรเตอร์<< 'NS';
เอาต์พุตคือ 4.4
โปรดทราบว่าครั้งนี้มีการใช้ const_reverse_iterator แทนที่จะใช้เพียง reverse_iterator เพื่อรับตัววนซ้ำที่ส่งคืน
เรนเดอร์ () noexcept
ส่งกลับตัววนซ้ำที่ชี้ก่อนองค์ประกอบแรกของเวกเตอร์ พิจารณาส่วนรหัสต่อไปนี้:
เวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};เวกเตอร์<ลอย> ::reverse_iteratorไรเตอร์=วีทีอาร์ทำให้();
ค่าใช้จ่าย<< *ไรเตอร์<< 'NS';
ผลลัพธ์คือ 0 ซึ่งไม่มีความหมาย เนื่องจากไม่มีองค์ประกอบที่เป็นรูปธรรมก่อนองค์ประกอบแรก
แสดงผล () const noexcept
ส่งกลับตัววนซ้ำที่ชี้ก่อนองค์ประกอบแรกของเวกเตอร์ เมื่อการสร้างเวกเตอร์นำหน้าด้วย const นิพจน์ Rend() const จะถูกดำเนินการแทนการrend() พิจารณาส่วนรหัสต่อไปนี้:
constเวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};เวกเตอร์<ลอย> ::const_reverse_iteratorไรเตอร์=วีทีอาร์ทำให้();
ค่าใช้จ่าย<< *ไรเตอร์<< 'NS';
ผลลัพธ์คือ 0
โปรดทราบว่าครั้งนี้มีการใช้ const_reverse_iterator แทนที่จะใช้เพียง reverse_iterator เพื่อรับตัววนซ้ำที่ส่งคืน
ตัวดัดแปลงเวกเตอร์
โมดิฟายเออร์ที่แก้ไขเวกเตอร์สามารถรับหรือส่งคืนตัววนซ้ำได้
a.emplace(p, args)
แทรกวัตถุประเภท T ที่สร้างด้วย std::forward(args)… ก่อนหน้า
สำหรับรายละเอียด – ดูภายหลังแทรก (iteratorPosition, ค่า)
แทรกสำเนาของค่าที่ตำแหน่งตัววนซ้ำของเวกเตอร์ ส่งกลับตัววนซ้ำ (ตำแหน่ง) ในเวกเตอร์ที่วางสำเนาไว้ รหัสต่อไปนี้แสดงตำแหน่งที่วางค่า:
เวกเตอร์<int>vtr{10, ยี่สิบ, 30, 40};เวกเตอร์<int> ::iteratoriter=วีทีอาร์เริ่ม();
++iter;
++iter;
วีทีอาร์แทรก(iter, 25);
ค่าใช้จ่าย<<vtr[1] << '' <<vtr[2]<< '
' <<vtr[3] << 'NS';
ผลลัพธ์คือ: 20 25 30
โปรดทราบว่าตัววนซ้ำนั้นเป็นขั้นสูง (เพิ่มขึ้น) เหมือนกับตัวชี้
นอกจากนี้ยังสามารถแทรกรายการ initializer ได้ดังที่แสดงในโค้ดต่อไปนี้:
เวกเตอร์<int>vtr{10, ยี่สิบ, 30, 40};เวกเตอร์<int> ::iteratoriter=วีทีอาร์เริ่ม();
++iter;
++iter;
วีทีอาร์แทรก(iter, {25, 28});
ค่าใช้จ่าย<<vtr[1] << '' <<vtr[2]<< '
' <<vtr[3]<< '' <<vtr[4] << 'NS';
ผลลัพธ์คือ: 20 25 28 30
ลบ(ตำแหน่ง)
ลบองค์ประกอบที่ตำแหน่งที่ตัววนซ้ำชี้ไป จากนั้นส่งคืนตำแหน่งตัววนซ้ำ รหัสต่อไปนี้แสดงให้เห็นสิ่งนี้:
เวกเตอร์<int>vtr{10, ยี่สิบ, 30, 40};เวกเตอร์<int> ::iteratoriter=วีทีอาร์เริ่ม();
++iter;
++iter;
วีทีอาร์ลบ(iter);
ค่าใช้จ่าย<<vtr[0] << '' <<vtr[1] << '
' <<vtr[2]<< 'NS';
ผลลัพธ์คือ: 10 20 40
push_back(t), push_back(rv)
ใช้เพื่อเพิ่มองค์ประกอบเดียวที่ส่วนท้ายของเวกเตอร์ ใช้ push_back(t) ดังนี้:
เวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};วีทีอาร์push_back(5.5);
ลอยฟล=vtr[4];
ค่าใช้จ่าย<<ฟล<< 'NS';
ผลลัพธ์คือ 5.5
push_back(rv): -ดูในภายหลังpop_back()
ลบองค์ประกอบสุดท้ายโดยไม่ส่งคืน ขนาดของเวกเตอร์ลดลง 1 รหัสต่อไปนี้แสดงสิ่งนี้:
เวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};วีทีอาร์pop_back();
ลอยNS=วีทีอาร์ขนาด();
ค่าใช้จ่าย<<NS<< 'NS';
ผลลัพธ์คือ 3
a.swap(b)
สามารถสลับเวกเตอร์สองเวกเตอร์ได้ ดังแสดงในส่วนของโค้ดต่อไปนี้:
เวกเตอร์<ลอย>vtr1{1.1, 2.2, 3.3, 4.4};เวกเตอร์<ลอย>vtr2{10, ยี่สิบ};
vtr1.แลกเปลี่ยน(vtr2);
ค่าใช้จ่าย<< 'vtr1:'<<vtr1[0] <<''<<vtr1[1] <<'
'<<vtr1[2] <<''<<vtr1[3] << 'NS';
ค่าใช้จ่าย<< 'vtr2:'<<vtr2[0] <<''<<vtr2[1] <<'
'<<vtr2[2] <<''<<vtr2[3] << 'NS';
ผลลัพธ์คือ:
vtr1: 10 ยี่สิบ 0 0vtr2: 1.1 2.2 3.3 4.4
โปรดทราบว่าความยาวของเวกเตอร์จะเพิ่มขึ้น หากจำเป็น นอกจากนี้ ค่าที่ไม่มีการแทนที่จะถูกแทนที่ด้วยค่าเริ่มต้นบางค่า
แจ่มใส()
ลบองค์ประกอบทั้งหมดออกจากเวกเตอร์ ตามที่แสดงส่วนของรหัสต่อไปนี้:
เวกเตอร์<ลอย>vtr{1.1, 2.2, 3.3, 4.4};วีทีอาร์แจ่มใส();
ค่าใช้จ่าย<<วีทีอาร์ขนาด() << 'NS';
ผลลัพธ์คือ 0
ความเท่าเทียมกันและตัวดำเนินการเชิงสัมพันธ์สำหรับเวกเตอร์
ตัวดำเนินการ ==
คืนค่า 1 สำหรับค่า จริง หากเวกเตอร์ทั้งสองมีขนาดเท่ากันและองค์ประกอบที่เกี่ยวข้องกันนั้นเท่ากัน มิฉะนั้นจะส่งกลับ 0 สำหรับเท็จ ตัวอย่างเช่น:
เวกเตอร์<int>ยู{1, 2, 3};เวกเตอร์<int>วี{4, 5, 6};
บูล บลู=ยู==วี;
ค่าใช้จ่าย<<บลู<< 'NS';
ผลลัพธ์คือ 0
!= โอเปอเรเตอร์
คืนค่า 1 สำหรับค่า จริง หากเวกเตอร์ทั้งสองไม่มีขนาดเท่ากัน และ/หรือองค์ประกอบที่เกี่ยวข้องกันไม่เท่ากัน มิฉะนั้นจะส่งกลับ 0 สำหรับเท็จ ตัวอย่างเช่น:
เวกเตอร์<int>ยู{1, 2, 3};เวกเตอร์<int>วี{4, 5, 6};
บูล บลู=ยู! =วี;
ค่าใช้จ่าย<<บลู<< 'NS';
ผลลัพธ์คือ 1
NS
คืนค่า 1 สำหรับค่า 'จริง' หากเวกเตอร์แรกเป็นเซตย่อยเริ่มต้นของเวกเตอร์ที่สอง โดยองค์ประกอบของสองส่วนที่เท่ากันจะเหมือนกันและอยู่ในลำดับเดียวกัน หากเวกเตอร์ทั้งสองมีขนาดเท่ากันและเคลื่อนจากซ้ายไปขวา และพบองค์ประกอบในเวกเตอร์แรกซึ่งน้อยกว่าองค์ประกอบที่สอดคล้องกันในเวกเตอร์ที่สอง ดังนั้น 1 จะยังคงส่งคืน มิฉะนั้น 0 สำหรับ false จะถูกส่งกลับ ตัวอย่างเช่น:
เวกเตอร์<int>ยู{3, 1, 1};เวกเตอร์<int>วี{3, 2, 1};
บูล บลู=ยู<วี;
ค่าใช้จ่าย<<บลู<< 'NS';
ผลลัพธ์คือ 1 ที่ > โอเปอเรเตอร์ กลับมา! (U NS<= Operator คืน U<= V, where U is the first vector and V is the second vector, according to the above definitions. >= โอเปอเรเตอร์ กลับมา! (U<= V), where U is the first vector and V is the second vector, according to the above definitions. เวกเตอร์คือตัวอย่างของคอนเทนเนอร์ลำดับ เวกเตอร์เป็นรูปแบบที่ดีกว่าของอาร์เรย์ธรรมดาและสร้างขึ้นจากคลาส เวกเตอร์มีวิธีการที่จัดอยู่ในประเภท: การก่อสร้างและการกำหนด ความจุ การเข้าถึงองค์ประกอบ การเข้าถึงข้อมูล ตัววนซ้ำ ตัวดัดแปลง และตัวดำเนินการที่เป็นตัวเลขมากเกินไป มีคอนเทนเนอร์ลำดับอื่น ๆ ที่เรียกว่า list, forward_list และ array หากงานเกี่ยวข้องกับการแทรกและการลบบ่อยครั้งที่ตรงกลางของลำดับ ควรใช้รายการหรือรายการส่งต่อ หากงานเกี่ยวข้องกับการแทรกและการลบบ่อยครั้งที่จุดเริ่มต้นหรือจุดสิ้นสุดของลำดับ ควรใช้ deque ดังนั้น ควรใช้เวกเตอร์ก็ต่อเมื่อการดำเนินการประเภทนี้ไม่สำคัญบทสรุป