std::รายการใน C++ พร้อมตัวอย่าง
std::รายการคืออะไร?
In C++รายการ std::list อ้างถึงคอนเทนเนอร์ที่เก็บข้อมูล std:list ช่วยให้คุณสามารถแทรกและลบรายการได้จากทุกที่ รายการ std::list ถูกนำมาใช้เป็นรายการที่มีการเชื่อมโยงแบบทวีคูณ ซึ่งหมายความว่าข้อมูลรายการสามารถเข้าถึงได้แบบสองทิศทางและตามลำดับ
รายการไลบรารีเทมเพลตมาตรฐานไม่รองรับการเข้าถึงแบบสุ่มอย่างรวดเร็ว แต่รองรับการเข้าถึงตามลำดับจากทุกทิศทาง
คุณสามารถกระจายองค์ประกอบรายการในส่วนหน่วยความจำต่างๆ ได้ ข้อมูลที่จำเป็นสำหรับการเข้าถึงข้อมูลตามลำดับจะถูกจัดเก็บไว้ในคอนเทนเนอร์ รายการ std::สามารถขยายและย่อจากปลายทั้งสองด้านได้ตามต้องการในระหว่างรันไทม์ ตัวจัดสรรภายในจะตอบสนองความต้องการพื้นที่เก็บข้อมูลโดยอัตโนมัติ
เหตุใดจึงใช้ std::list
นี่คือเหตุผลของการใช้ std::List :
- std::list ทำได้ดีกว่าเมื่อเปรียบเทียบกับคอนเทนเนอร์ลำดับอื่นๆ เช่น array และ vector
- มีประสิทธิภาพที่ดีกว่าในการแทรก ย้าย และแยกองค์ประกอบออกจากตำแหน่งใดๆ
- std::list ยังทำงานได้ดีขึ้นกับอัลกอริทึมที่ดำเนินการอย่างเข้มข้นดังกล่าวอีกด้วย
ไวยากรณ์รายการ
ในการกำหนดรายการ std:: เราต้องนำเข้าไฟล์ ไฟล์ส่วนหัว นี่คือไวยากรณ์คำจำกัดความ std::list:
template < class Type, class Alloc =allocator<T> > class list;
นี่คือคำอธิบายของพารามิเตอร์ข้างต้น:
- T – กำหนดประเภทขององค์ประกอบที่มีอยู่ คุณสามารถแทนที่ T ด้วยประเภทข้อมูลใดก็ได้ แม้แต่ประเภทที่ผู้ใช้กำหนดก็ตาม
- จัดสรร – กำหนดประเภทของออบเจ็กต์ตัวจัดสรร ซึ่งจะใช้เทมเพลตคลาสตัวจัดสรรตามค่าเริ่มต้น ขึ้นอยู่กับค่าและใช้แบบจำลองการจัดสรรหน่วยความจำอย่างง่าย
ตัวอย่าง 1
#include <algorithm> #include <iostream> #include <list> int main() { std::list<int> my_list = { 12, 5, 10, 9 }; for (int x : my_list) { std::cout << x << '\n'; } }
Output:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- รวมไฟล์ส่วนหัวของอัลกอริทึมเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัว iostream เพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของรายการเพื่อใช้ฟังก์ชันต่างๆ
- เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในเนื้อหาของฟังก์ชันนี้
- สร้างรายการชื่อ my_list ด้วยชุดจำนวนเต็ม 4 ตัว
- ใช้ for loop เพื่อสร้างตัวแปร loop x ตัวแปรนี้จะถูกนำมาใช้เพื่อวนซ้ำองค์ประกอบรายการ
- พิมพ์ค่าของรายการบนคอนโซล
- ส่วนปลายของลำตัว สำหรับห่วง.
- ส่วนท้ายของฟังก์ชัน main()
C++ รายการฟังก์ชั่น
ต่อไปนี้เป็นฟังก์ชัน std::list ทั่วไป:
ฟังก์ชัน | Descriptไอออน |
---|---|
แทรก() | ฟังก์ชันนี้จะแทรกรายการใหม่ก่อนตำแหน่งที่ตัววนซ้ำชี้ |
ผลักดัน_กลับ() | ฟังก์ชันนี้จะเพิ่มรายการใหม่ที่ส่วนท้ายของรายการ |
push_front() | โดยจะเพิ่มรายการใหม่ที่ด้านหน้าของรายการ |
pop_front() | มันจะลบรายการแรกของรายการ |
ขนาด() | ฟังก์ชันนี้กำหนดจำนวนองค์ประกอบรายการ |
ด้านหน้า() | เพื่อกำหนดรายการแรกของรายการ |
กลับ() | เพื่อกำหนดรายการสุดท้ายของรายการ |
ย้อนกลับ () | มันกลับรายการ |
ผสาน() | มันรวมสองรายการที่เรียงลำดับเข้าด้วยกัน |
คอนสตรัคเตอร์
นี่คือรายการของ ฟังก์ชั่น จัดทำโดย ไฟล์ส่วนหัว:
- ตัวสร้างเริ่มต้น std::list::list()- มันสร้างรายการว่างที่มีองค์ประกอบเป็นศูนย์
- Fill Constructor std::list::list()- สร้างรายการที่มีองค์ประกอบ n และกำหนดค่าเป็นศูนย์ (0) ให้กับแต่ละองค์ประกอบ
- ตัวสร้างช่วง std::list::list()- สร้างรายการที่มีองค์ประกอบมากมายในช่วงแรกถึงสุดท้าย
- คัดลอกตัวสร้าง std::list::list()- สร้างรายการพร้อมสำเนาของแต่ละองค์ประกอบที่มีอยู่ในรายการที่มีอยู่
- Move Constructor std::list::list()- สร้างรายการที่มีองค์ประกอบของรายการอื่นโดยใช้ความหมายการย้าย
- ตัวสร้างรายการ Initializer std::list::list()-มันสร้างรายการที่มีองค์ประกอบของรายการอื่นโดยใช้ซีแมนทิกส์การย้าย
2 ตัวอย่าง
#include <iostream> #include <list> using namespace std; int main(void) { list<int> l; list<int> l1 = { 10, 20, 30 }; list<int> l2(l1.begin(), l1.end()); list<int> l3(move(l1)); cout << "Size of list l: " << l.size() << endl; cout << "List l2 contents: " << endl; for (auto it = l2.begin(); it != l2.end(); ++it) cout << *it << endl; cout << "List l3 contents: " << endl; for (auto it = l3.begin(); it != l3.end(); ++it) cout << *it << endl; return 0; }
Output:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- รวมไฟล์ส่วนหัว iostream เพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของรายการเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานในโค้ดเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในเนื้อหาของฟังก์ชันนี้
- สร้างรายการว่างชื่อ l
- สร้างรายการชื่อ l1 โดยมีชุดจำนวนเต็ม 3 ตัว
- สร้างรายการชื่อ l2 โดยมีองค์ประกอบทั้งหมดในรายการชื่อ l1 ตั้งแต่ต้นจนจบ
- สร้างรายการชื่อ l3 โดยใช้อรรถศาสตร์การย้าย รายการ l3 จะมีเนื้อหาเหมือนกับรายการ l2
- พิมพ์ขนาดของรายการชื่อ l บนคอนโซลควบคู่ไปกับข้อความอื่น
- พิมพ์ข้อความบนคอนโซล
- สร้างตัววนซ้ำตั้งชื่อมันและใช้เพื่อวนซ้ำองค์ประกอบของรายการที่ชื่อ l2
- พิมพ์องค์ประกอบของรายการชื่อ l2 บนคอนโซล
- พิมพ์ข้อความบนคอนโซล
- สร้างตัววนซ้ำตั้งชื่อมันและใช้เพื่อวนซ้ำองค์ประกอบของรายการที่ชื่อ l3
- พิมพ์องค์ประกอบของรายการชื่อ l3 บนคอนโซล
- โปรแกรมจะต้องคืนค่าเมื่อเสร็จสิ้นสำเร็จ
- ส่วนท้ายของฟังก์ชัน main()
คุณสมบัติของคอนเทนเนอร์
นี่คือรายการคุณสมบัติคอนเทนเนอร์:
อสังหาริมทรัพย์ | Descriptไอออน |
---|---|
ลำดับ | คอนเทนเนอร์ลำดับจะเรียงลำดับองค์ประกอบตามลำดับเชิงเส้นที่เข้มงวด เข้าถึงองค์ประกอบต่างๆ ตามตำแหน่งในลำดับ |
รายการที่เชื่อมโยงแบบทวีคูณ | องค์ประกอบแต่ละองค์ประกอบจะมีข้อมูลเกี่ยวกับวิธีการค้นหาองค์ประกอบก่อนหน้าและถัดไป ซึ่งช่วยให้มีเวลาคงที่สำหรับการแทรกและการลบ |
ผู้จัดสรรทราบ | วัตถุตัวจัดสรรใช้สำหรับการปรับเปลี่ยนขนาดพื้นที่เก็บข้อมูลแบบไดนามิก |
การแทรกลงในรายการ
มีฟังก์ชันต่างๆ ที่เราสามารถใช้เพื่อแทรกค่าลงในรายการได้ มาสาธิตสิ่งนี้กัน:
3 ตัวอย่าง
#include <algorithm> #include <iostream> #include <list> int main() { std::list<int> my_list = { 12, 5, 10, 9 }; my_list.push_front(11); my_list.push_back(18); auto it = std::find(my_list.begin(), my_list.end(), 10); if (it != my_list.end()) { my_list.insert(it, 21); } for (int x : my_list) { std::cout << x << '\n'; } }
Output:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- รวมไฟล์ส่วนหัวของอัลกอริทึมเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัว iostream เพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของรายการเพื่อใช้ฟังก์ชันต่างๆ
- เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในเนื้อหาของฟังก์ชันนี้
- สร้างรายการชื่อ my_list ด้วยชุดจำนวนเต็ม 4 ตัว
- แทรกองค์ประกอบ 11 ที่ด้านหน้าของรายการชื่อ my_list
- แทรกองค์ประกอบ 18 ที่ส่วนท้ายของรายการชื่อ my_list
- สร้างตัววนซ้ำและใช้เพื่อค้นหาองค์ประกอบ 10 จากรายการ my_list
- ใช้คำสั่ง if เพื่อตรวจสอบว่าพบองค์ประกอบข้างต้นหรือไม่
- แทรกองค์ประกอบ 21 ก่อนองค์ประกอบด้านบนหากพบ
- ส่วนท้ายของคำสั่ง if
- ใช้ for loop เพื่อสร้างตัวแปร loop x ตัวแปรนี้จะถูกนำมาใช้เพื่อวนซ้ำองค์ประกอบรายการ
- พิมพ์ค่าของรายการบนคอนโซล
- ส่วนท้ายของตัว for a loop
- ส่วนท้ายของฟังก์ชัน main()
การลบออกจากรายการ
สามารถลบรายการออกจากรายการได้ ฟังก์ชั่นลบ () ช่วยให้คุณสามารถลบรายการหรือช่วงของรายการออกจากรายการได้
- หากต้องการลบรายการเดียว คุณเพียงแค่ผ่านตำแหน่งจำนวนเต็มหนึ่งตำแหน่ง รายการจะถูกลบ
- หากต้องการลบช่วง คุณต้องผ่านตัววนเริ่มต้นและตัววนสิ้นสุด มาสาธิตสิ่งนี้กัน
4 ตัวอย่าง
#include <algorithm> #include <iostream> #include <list> using namespace std; int main() { std::list<int> my_list = { 12, 5, 10, 9 }; cout << "List elements before deletion: "; for (int x : my_list) { std::cout << x << '\n'; } list<int>::iterator i = my_list.begin(); my_list.erase(i); cout << "\nList elements after deletion: "; for (int x : my_list) { std::cout << x << '\n'; } return 0; }
Output:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- รวมไฟล์ส่วนหัวของอัลกอริทึมเพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัว iostream เพื่อใช้ฟังก์ชันต่างๆ
- รวมไฟล์ส่วนหัวของรายการเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานในโปรแกรมของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในเนื้อหาของฟังก์ชันนี้
- สร้างรายการชื่อ my_list ด้วยชุดจำนวนเต็ม 4 ตัว
- พิมพ์ข้อความบนคอนโซล
- ใช้ for loop เพื่อสร้างตัวแปร loop x ตัวแปรนี้จะถูกนำมาใช้เพื่อวนซ้ำองค์ประกอบรายการ
- พิมพ์ค่าของรายการบนคอนโซล
- ส่วนท้ายของ for loop
- สร้างตัววนซ้ำ i ที่ชี้ไปยังองค์ประกอบแรกของรายการ
- ใช้ฟังก์ชันลบ () ชี้โดยตัววนซ้ำ i
- พิมพ์ข้อความบนคอนโซล
- ใช้ for loop เพื่อสร้างตัวแปร loop x ตัวแปรนี้จะถูกนำมาใช้เพื่อวนซ้ำองค์ประกอบรายการ
- พิมพ์ค่าของรายการบนคอนโซล สิ่งนี้เกิดขึ้นหลังจากการลบ
- ส่วนท้ายของ for loop
- โปรแกรมจะต้องส่งคืนค่าเมื่อดำเนินการเสร็จสิ้น
- ส่วนท้ายของฟังก์ชัน main()
สรุป
- std::list เป็นคอนเทนเนอร์ที่เก็บข้อมูล
- ช่วยให้สามารถแทรกและลบรายการได้จากทุกที่ในเวลาคงที่
- มันถูกนำไปใช้เป็นลิงค์คู่
- ข้อมูล std::list สามารถเข้าถึงได้แบบสองทิศทางและตามลำดับ
- std::list ไม่รองรับการเข้าถึงแบบสุ่มอย่างรวดเร็ว อย่างไรก็ตาม รองรับการเข้าถึงตามลำดับจากทุกทิศทาง
- คุณสามารถกระจายองค์ประกอบรายการของ std::list ในส่วนหน่วยความจำที่แตกต่างกัน
- คุณสามารถย่อหรือขยาย std::list จากปลายทั้งสองข้างได้ตามต้องการระหว่างรันไทม์
- ในการแทรกรายการต่างๆ ลงใน std::list เราใช้ฟังก์ชัน insert()
- หากต้องการลบรายการออกจาก std::list เราใช้ฟังก์ชันลบ ()