วิธีใช้ C++ Vector

How Use C Vector



บทนำ

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

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: 2
vtr2: 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';

ผลลัพธ์มีดังต่อไปนี้:

1
0
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 0
vtr2: 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 ดังนั้น ควรใช้เวกเตอร์ก็ต่อเมื่อการดำเนินการประเภทนี้ไม่สำคัญ