แผนที่ใน C++ ไลบรารีเทมเพลตมาตรฐาน (STL)

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

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

  • 🗺️ คอนเทนเนอร์แบบเชื่อมโยง: A C++ แผนที่จะจัดเก็บรายการต่างๆ ในรูปแบบคู่คีย์-ค่า โดยใช้คีย์ที่ไม่ซ้ำกันและเรียงลำดับโดยอัตโนมัติ
  • 🧩 ส่วนหัวและไวยากรณ์: รวมส่วนหัวของแผนที่ จากนั้นประกาศ std::map ชื่อสำหรับจัดเก็บคู่ข้อมูลประเภทต่างๆ
  • 🛠️ ฟังก์ชั่นในตัว: เมธอด begin(), size(), empty(), insert(), find(), erase() และ clear() ใช้สำหรับจัดการเนื้อหาของแผนที่ (map)
  • 🔄 การวนซ้ำ: ตัววนซ้ำแบบสองทิศทางจะวนไปตามองค์ประกอบของแผนที่ตามลำดับคีย์ที่เรียงไว้ เพื่ออ่านหรือลบข้อมูล
  • 🔑 รหัสเฉพาะ: สององค์ประกอบไม่สามารถใช้คีย์ร่วมกันได้ ซึ่งทำให้แผนที่ (map) เหมาะอย่างยิ่งที่จะใช้เป็นอาร์เรย์แบบเชื่อมโยง (associative array)
  • 🤖 ความช่วยเหลือจากเอไอ: GitHub Copilot และผู้ช่วย AI ที่คล้ายกันจะสร้างโครงสร้างการประกาศแผนที่และลูปจากข้อความแสดงความคิดเห็นสั้นๆ

แผนที่ใน C++ STL

แผนที่อยู่ในอะไร C++?

In C++MAP คือคอนเทนเนอร์แบบเชื่อมโยงที่จัดเก็บรายการในรูปแบบที่แมปไว้ แต่ละรายการในแผนที่ประกอบด้วยค่าคีย์และค่าที่แมปไว้ ค่าที่แมปไว้สองค่าไม่สามารถใช้ค่าคีย์เดียวกันได้

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

ก่อนที่จะเขียนโค้ดใดๆ การเข้าใจว่าทำไมแผนที่ (map) จึงมักเป็นคอนเทนเนอร์ที่เหมาะสมที่สุดนั้นจะเป็นประโยชน์

เหตุใดจึงต้องใช้ std::map

ต่อไปนี้คือเหตุผลที่ควรใช้แผนที่:

  • std::map จะเก็บเฉพาะคีย์ที่ไม่ซ้ำกัน โดยเรียงลำดับตามเกณฑ์การเรียงลำดับที่เลือกไว้
  • การค้นหาองค์ประกอบโดยใช้คีย์นั้นง่ายและรวดเร็ว
  • แต่ละคีย์แนบองค์ประกอบเดียวเท่านั้น
  • std::map สามารถใช้เป็นอาร์เรย์ที่เชื่อมโยงได้
  • std::map สามารถนำไปใช้งานได้โดยใช้โครงสร้างต้นไม้ไบนารีแบบสมดุล

เพื่อนำข้อดีเหล่านี้ไปใช้ประโยชน์ ให้เริ่มต้นด้วยไวยากรณ์การประกาศ

วากยสัมพันธ์

หากต้องการประกาศ std::map ให้ใช้ไวยากรณ์นี้:

std::map<key_datatype, value_datatype>map_name; 
  • การขอ ประเภทข้อมูลคีย์ หมายถึงประเภทข้อมูลของคีย์แผนที่
  • การขอ ประเภทข้อมูลค่า หมายถึงประเภทข้อมูลของค่าที่สอดคล้องกับคีย์แผนที่
  • การขอ map_name คือชื่อแผนที่

ตัวอย่างเช่น:

map<string, int> my_map; 

เราได้ประกาศแผนที่ชื่อ my_map โดยแผนที่นี้จะมีสตริงเป็นชนิดข้อมูลคีย์ และจำนวนเต็มเป็นชนิดข้อมูลค่า

ประเภทสมาชิก

ฟังก์ชันสมาชิกสามารถใช้ประเภทสมาชิกต่อไปนี้เป็นพารามิเตอร์หรือประเภทส่งคืนได้:

  • คีย์_ประเภท: คีย์ (พารามิเตอร์แรกในเทมเพลต)
  • แมป_ประเภท: T (พารามิเตอร์ตัวที่สองในเทมเพลต)
  • คีย์_เปรียบเทียบ: เปรียบเทียบ (พารามิเตอร์ที่สามในเทมเพลต)
  • ตัวจัดสรร_ประเภท: จัดสรร (พารามิเตอร์ที่สี่ในเทมเพลต)
  • ค่า_ประเภท: คู่
  • มูลค่า_เปรียบเทียบ: คลาสฟังก์ชันที่ซ้อนกันสำหรับการเปรียบเทียบองค์ประกอบ
  • อ้างอิง: allocator_type::การอ้างอิง
  • const_reference: allocator_type::const_reference
  • ตัวชี้: allocator_type::ตัวชี้
  • const_pointer: allocator_type::const_pointer
  • ตัววนซ้ำ: ตัววนซ้ำแบบสองทิศทางไปยัง value_type
  • const_iterator: ตัววนซ้ำแบบสองทิศทางไปยัง const value_type
  • ย้อนกลับ_ตัววนซ้ำ: ตัววนซ้ำแบบย้อนกลับ
  • const_reverse_iterator: ตัววนซ้ำแบบย้อนกลับคงที่
  • ความแตกต่าง_ประเภท: ptrdiff_t
  • ขนาด_ประเภท: ขนาด_t

ฟังก์ชั่นในตัวของ std::map

std::map มาพร้อมกับฟังก์ชั่น inbuilt บางส่วนได้แก่:

  • เริ่มต้น () – ฟังก์ชันนี้จะส่งคืนตัววนซ้ำไปยังรายการแรกของแผนที่
  • ขนาด() – ฟังก์ชันนี้จะส่งคืนจำนวนรายการในแผนที่
  • ว่างเปล่า() – ฟังก์ชันนี้จะส่งคืนค่าบูลีนที่ระบุว่าแผนที่นั้นว่างเปล่าหรือไม่
  • แทรก (คู่ (คีย์, ค่า)) – ฟังก์ชันนี้จะแทรกคู่คีย์-ค่าใหม่ลงในแผนที่ (map)
  • หาค่า (val) – ฟังก์ชันนี้จะส่งคืนตัววนซ้ำไปยังองค์ประกอบ val หากพบ มิฉะนั้นจะส่งคืน m.end()
  • ลบ (ตำแหน่งตัววนซ้ำ) – ฟังก์ชันนี้จะลบรายการที่ตำแหน่งที่ชี้โดยตัววนซ้ำ
  • ลบ(const g) – ฟังก์ชันนี้จะลบคู่คีย์-ค่า g ออกจากแผนที่ (map)
  • ชัดเจน() – ฟังก์ชันนี้จะลบรายการทั้งหมดออกจากแผนที่

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

การวนซ้ำองค์ประกอบแผนที่

คุณสามารถวนซ้ำผ่านองค์ประกอบในแผนที่ได้ เราเพียงแค่ต้องสร้างตัววนซ้ำและใช้มันเพื่อทำเช่นนั้น ตัวอย่างเช่น:

1 ตัวอย่าง

#include <iostream>
#include <string>
#include <map> 

using namespace std;
int main() {

	map<int, string> Students;

	Students.insert(std::pair<int, string>(200, "Alice"));

	Students.insert(std::pair<int, string>(201, "John"));

	cout << "Map size is: " << Students.size() << endl;

	cout << endl << "Default map Order is: " << endl;

	for (map<int, string>::iterator it = Students.begin(); it != Students.end(); ++it) {

		cout << (*it).first << ": " << (*it).second << endl;
	}
}

Output:

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

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

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

Code คำอธิบาย:

  1. รวมไฟล์ส่วนหัว iostream ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
  2. รวมไฟล์ส่วนหัวของสตริงลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
  3. รวมไฟล์ส่วนหัวของแผนที่ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
  4. รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
  5. เรียกใช้ฟังก์ชัน main() { เป็นจุดเริ่มต้นของเนื้อความของฟังก์ชัน
  6. สร้างแผนที่ชื่อ Students โดยที่คีย์จะเป็นจำนวนเต็ม และค่าจะเป็นสตริง
  7. แทรกค่าลงในแผนที่นักเรียน คีย์ 200 และค่าของ Alice จะถูกแทรกลงในแผนที่
  8. แทรกค่าลงในแผนที่นักเรียน คีย์ 201 และค่าของ John จะถูกแทรกลงในแผนที่
  9. ใช้ฟังก์ชัน `size()` เพื่อหาขนาดของแผนที่ชื่อ `Students` ผลลัพธ์ที่ได้ควรเป็น 2
  10. พิมพ์ข้อความบนคอนโซล
  11. ใช้ for loop เพื่อสร้างตัววนซ้ำโดยตั้งชื่อเพื่อวนซ้ำองค์ประกอบของแผนที่ชื่อ Students
  12. พิมพ์ค่าของแผนที่นักเรียนบนคอนโซล
  13. ส่วนท้ายของ for loop
  14. ส่วนท้ายของฟังก์ชัน main()

การแทรกข้อมูลใน std::map

คุณสามารถเพิ่มรายการลงใน std::map โดยใช้ฟังก์ชัน insert() โปรดจำไว้ว่าคีย์ของ std::map ต้องไม่ซ้ำกัน

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

ฟังก์ชั่นมีรูปแบบต่างๆ ดังต่อไปนี้:

  • แทรก (คู่) – ด้วยรูปแบบนี้ จะมีการแทรกคู่คีย์-ค่าเข้าไปในแผนที่
  • แทรก (start_itr, end_itr) – ด้วยรูปแบบนี้ ข้อมูลจะถูกแทรกเข้าไปภายในช่วงที่กำหนดโดย start_itr และ end_itr จากแผนที่อื่น

ฟังก์ชัน insert_or_assign() ทำงานในลักษณะเดียวกับฟังก์ชัน insert() แต่ถ้าคีย์ที่กำหนดมีอยู่ในแผนที่อยู่แล้ว ค่าของคีย์นั้นจะถูกแก้ไข

2 ตัวอย่าง

#include <map>
#include <iostream>

using namespace std;

int main() {

	map<int, int> m{ {1,3} , {2,4} , {3,5} };

	m.insert({ 5, 6 });
	m.insert({ 1, 8 });

	m.insert_or_assign(1, 6);  
	
	cout << "Key\tElement\n";
	for (auto itr = m.begin(); itr != m.end(); ++itr) {
		cout << itr->first << '\t' << itr->second << '\n';
	}
	return 0;
}

Output:

C++ ตัวอย่างผลลัพธ์การแทรกแผนที่ 2

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

C++ ตัวอย่างโค้ดการแทรกแผนที่ 2

Code คำอธิบาย:

  1. รวมไฟล์ส่วนหัวของแผนที่ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
  2. รวมไฟล์ส่วนหัว iostream ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
  3. รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
  4. เรียกใช้ฟังก์ชัน main() { เป็นจุดเริ่มต้นของเนื้อความของฟังก์ชัน
  5. สร้างแผนที่ชื่อ m โดยที่คีย์จะเป็นจำนวนเต็ม และค่าจะเป็นจำนวนเต็ม มีการสร้างรายการสามรายการลงในแผนที่
  6. แทรกรายการใหม่ลงในแผนที่ m คีย์ 5 และค่า 6 จะถูกแทรกลงในแผนที่
  7. กำลังพยายามสร้างรายการลงในคีย์ที่มีอยู่แล้ว เนื่องจากคีย์ 1 มีอยู่แล้วในแผนที่ จึงไม่สามารถป้อนข้อมูลได้
  8. ใช้ฟังก์ชัน insert_or_assign() เพื่อแทรกหรือแก้ไขรายการที่มีอยู่แล้ว เนื่องจากคีย์ 1 มีอยู่แล้ว ค่าของมันจะถูกเปลี่ยนเป็น 6
  9. พิมพ์ข้อความบนคอนโซล อักขระ “\t” สร้างช่องว่างแนวนอนในขณะที่อักขระ “\n” เลื่อนเคอร์เซอร์ของเมาส์ไปยังบรรทัดถัดไป
  10. ใช้ สำหรับห่วง เพื่อสร้างตัววนซ้ำชื่อ itr เพื่อวนซ้ำองค์ประกอบของแผนที่ชื่อ m
  11. พิมพ์ค่าของแผนที่ m บนคอนโซล อักขระ “\t” สร้างช่องว่างแนวนอนระหว่างแต่ละคีย์และค่าที่สอดคล้องกัน ในทางตรงกันข้าม อักขระ “\n” จะเลื่อนเคอร์เซอร์ของเมาส์ไปยังบรรทัดถัดไปหลังจากการวนซ้ำทุกครั้ง
  12. ส่วนท้ายของ for loop
  13. โปรแกรมจะต้องส่งคืนค่าเมื่อดำเนินการเสร็จสิ้น
  14. ส่วนท้ายของฟังก์ชัน main()

การค้นหาในแผนที่

เราสามารถใช้ฟังก์ชัน find() เพื่อค้นหาองค์ประกอบในแผนที่โดยใช้คีย์ หากไม่พบคีย์ ฟังก์ชันจะส่งคืนค่า std::map::end แต่ถ้าพบ ฟังก์ชันจะส่งคืนตัววนซ้ำขององค์ประกอบที่ค้นหาได้

3 ตัวอย่าง

#include <iostream>
#include <string>
#include <map> 
using namespace std;
int main() {
	map<int, string> Students;
	Students.insert(std::pair<int, string>(200, "Alice"));
	Students.insert(std::pair<int, string>(201, "John"));
	std::map<int, string>::iterator it = Students.find(201);
	if (it != Students.end()) {
		std::cout << endl << "Key 201 has the value: => "<< Students.find(201)->second << '\n';
	}
}

Output:

C++ ตัวอย่างผลลัพธ์การค้นหาแผนที่ ตัวอย่างที่ 3

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

C++ ตัวอย่างโค้ดค้นหาแผนที่ ตัวอย่างที่ 3

Code คำอธิบาย:

  1. รวมไฟล์ส่วนหัว iostream ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ โดยไม่ได้รับข้อผิดพลาด
  2. รวมไฟล์ส่วนหัวของสตริงลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ โดยไม่ได้รับข้อผิดพลาด
  3. รวมไฟล์ส่วนหัวของแผนที่ลงในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ โดยไม่ได้รับข้อผิดพลาด
  4. รวมเนมสเปซมาตรฐานไว้ในโค้ดของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
  5. เรียกใช้ฟังก์ชัน main() เครื่องหมาย { แสดงจุดเริ่มต้นของส่วนเนื้อหาของฟังก์ชัน main()
  6. สร้างแผนที่ชื่อ Students ซึ่งคีย์จะเป็นจำนวนเต็มและสตริงค่า
  7. แทรกค่าลงในแผนที่นักเรียน คีย์ 200 และค่าของ Alice จะถูกแทรกลงในแผนที่
  8. แทรกค่าลงในแผนที่นักเรียน คีย์ 201 และค่าของ John จะถูกแทรกลงในแผนที่
  9. ค้นหาค่าที่เกี่ยวข้องกับคีย์ 201
  10. ใช้คำสั่ง if เพื่อตรวจสอบว่าพบค่าของคีย์หรือไม่
  11. พิมพ์ค่าของคีย์ควบคู่ไปกับข้อความบนคอนโซล
  12. ส่วนท้ายของคำสั่ง if
  13. ส่วนท้ายของฟังก์ชัน main()

การลบข้อมูลจากแผนที่

เราสามารถใช้ฟังก์ชัน erase() เพื่อลบค่าออกจากแผนที่ได้ โดยการสร้างตัววนซ้ำ (iterator) ที่ชี้ไปยังองค์ประกอบที่ต้องการลบ จากนั้นจึงส่งตัววนซ้ำนั้นไปยังฟังก์ชัน erase()

4 ตัวอย่าง

#include <iostream>
#include <string>
#include <map>

using namespace std;
int main() {

	map<std::string, int> my_map;

	my_map.insert(std::make_pair("cow", 1));

	my_map.insert(std::make_pair("cat", 2));

	my_map["lion"] = 3;

	map<std::string, int>::iterator it = my_map.find("cat");

	my_map.erase(it);

	for (map<string, int>::iterator it = my_map.begin(); it != my_map.end(); ++it)

		cout << (*it).first << ": " << (*it).second << endl;

  return 0;
}

Output:

C++ ลบแผนที่ ตัวอย่างที่ 4 ผลลัพธ์

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

C++ ลบแผนที่ ตัวอย่างโค้ด 4

Code คำอธิบาย:

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

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

std::map จัดเก็บคีย์โดยเรียงลำดับโดยใช้โครงสร้างข้อมูลแบบต้นไม้ค้นหาไบนารีที่ปรับสมดุลตัวเอง ทำให้การดำเนินการมีประสิทธิภาพ O(log n) std::unordered_map ใช้ตารางแฮชสำหรับการค้นหาที่มีประสิทธิภาพเฉลี่ย O(1) แต่จัดเก็บคีย์โดยไม่มีลำดับที่แน่นอน เลือกใช้ตามความต้องการในการเรียงลำดับของคุณ

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

ไม่ std::map เก็บเฉพาะคีย์ที่ไม่ซ้ำกันเท่านั้น ดังนั้นการแทรกคีย์ที่มีอยู่แล้วจะไม่เขียนทับคีย์เดิม หากต้องการคีย์ซ้ำ ให้ใช้ std::multimap ซึ่งอนุญาตให้หลายองค์ประกอบใช้ค่าคีย์เดียวกันได้

ใช้ map_name[key] เพื่ออ่านหรือกำหนดค่า ตัวดำเนินการดัชนีจะแทรกรายการเริ่มต้นหากไม่มีคีย์ สมาชิก at() จะโยนข้อยกเว้นหากไม่มีคีย์ ทำให้เป็นตัวเลือกที่ปลอดภัยกว่า

ส่งตัวเปรียบเทียบแบบกำหนดเองเป็นอาร์กิวเมนต์เทมเพลตตัวที่สาม เช่น std::map >. ตัวเปรียบเทียบที่ใหญ่กว่าจะเรียงลำดับคีย์จากค่าสูงสุดไปต่ำสุด แทนที่จะเป็นลำดับจากน้อยไปมากตามค่าเริ่มต้น

std::map เก็บคู่คีย์-ค่า และค้นหาค่าโดยใช้คีย์ ในขณะที่ std::set เก็บเฉพาะคีย์ที่ไม่ซ้ำกันโดยไม่มีค่าที่เกี่ยวข้อง ทั้งสองแบบจะเรียงลำดับองค์ประกอบ แต่ map จะเชื่อมโยงข้อมูลกับแต่ละคีย์

ใช่แล้ว ผู้ช่วยเขียนโค้ด AI จะแปลงข้อความแจ้งหรือความคิดเห็นสั้นๆ ให้เป็นโค้ด std::map ที่ใช้งานได้จริง รวมถึงการประกาศตัวแปร การเรียกใช้เมธอด insert และลูป iterator ควรตรวจสอบประเภทคีย์ ลำดับ และกรณีพิเศษต่างๆ ที่สร้างขึ้นก่อนทำการคอมไพล์เสมอ

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

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