วิธีใช้ C++ Unordered Map

How Use C Unordered Map



แผนที่ หรือที่เรียกว่าอาเรย์เชื่อมโยงคือรายการองค์ประกอบ โดยที่แต่ละองค์ประกอบเป็นคู่คีย์/ค่า ดังนั้น แต่ละคีย์จึงสอดคล้องกับค่าหนึ่ง กุญแจที่แตกต่างกันสามารถมีค่าเท่ากัน สำหรับงานทั่วไป ตัวอย่างเช่น คีย์สามารถเป็นรายการของผลไม้และค่าที่สอดคล้องกัน สีของผลไม้ ใน C ++ แผนที่ถูกนำมาใช้เป็นโครงสร้างข้อมูลที่มีฟังก์ชันสมาชิกและตัวดำเนินการ แผนที่ที่ได้รับคำสั่งคือแผนที่ที่คู่องค์ประกอบได้รับการจัดลำดับด้วยคีย์ แผนที่ที่ไม่เรียงลำดับคือแผนที่ที่ไม่มีลำดับ บทความนี้อธิบายวิธีใช้แผนที่แบบไม่เรียงลำดับ C++ เขียนเป็น unordered_map คุณต้องมีความรู้เกี่ยวกับตัวชี้ C ++ เพื่อทำความเข้าใจบทความนี้ unordered_map เป็นส่วนหนึ่งของไลบรารีมาตรฐาน C++

คลาสและวัตถุ

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







ชื่อ, unordered_map เป็นคลาส อ็อบเจ็กต์ที่สร้างจากคลาส unordered_map มีชื่อโปรแกรมเมอร์ที่เลือกไว้



จำเป็นต้องใช้ฟังก์ชันที่เป็นของคลาสเพื่อสร้างอินสแตนซ์ของอ็อบเจ็กต์จากคลาส ใน C++ ฟังก์ชันนั้นมีชื่อเดียวกับชื่อของคลาส ออบเจ็กต์ที่สร้าง (ทันที) จากคลาสมีชื่อเรียกต่างกันโดยโปรแกรมเมอร์



การสร้างวัตถุจากคลาสหมายถึงการสร้างวัตถุ มันยังหมายถึงการสร้างอินสแตนซ์





โปรแกรม C++ ซึ่งใช้คลาส unordered_map เริ่มต้นด้วยบรรทัดต่อไปนี้ที่ด้านบนของไฟล์:

#รวม
#รวม
ใช้เนมสเปซ std;

บรรทัดแรกเป็นอินพุต/เอาต์พุต บรรทัดที่สองคือการอนุญาตให้โปรแกรมใช้คุณลักษณะทั้งหมดของคลาส unordered_map บรรทัดที่สามอนุญาตให้โปรแกรมใช้ชื่อในเนมสเปซมาตรฐาน



โอเวอร์โหลดฟังก์ชัน

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

ก่อสร้าง/คัดลอกก่อสร้าง

การก่อสร้างที่เรียบง่าย

แผนที่ที่ไม่เรียงลำดับสามารถสร้างและกำหนดค่าได้ดังนี้:

unordered_map<const char*, const char*>อุมัป;

อุมัป['กล้วย'] = 'สีเหลือง';
อุมัป['องุ่น'] = 'เขียว';
อุมัป['รูปที่'] = 'สีม่วง';

การประกาศเริ่มต้นด้วยความเชี่ยวชาญพิเศษของเทมเพลตที่มีประเภทสำหรับคู่คีย์และค่า ตามด้วยชื่อที่โปรแกรมเมอร์เลือกสำหรับแผนที่ แล้วเครื่องหมายอัฒภาค ส่วนรหัสที่สองแสดงวิธีการกำหนดค่าให้กับคีย์
สร้างโดย Initializer_list
สามารถทำได้ดังนี้:

unordered_map<const char*, const char*>อุมัป({{'กล้วย', 'สีเหลือง'},
{'องุ่น', 'เขียว'}, {'รูปที่', 'สีม่วง'}});

สร้างโดยกำหนด Initializer_list
ตัวอย่าง:

unordered_map<const char*, const char*>อุมัป= {{'กล้วย', 'สีเหลือง'},
{'องุ่น', 'เขียว'}, {'รูปที่', 'สีม่วง'}};

สร้างโดยคัดลอก unordered_map . อื่น
ตัวอย่าง:

unordered_map<const char*, const char*>umap1({{'กล้วย', 'สีเหลือง'},
{'องุ่น', 'เขียว'}, {'รูปที่', 'สีม่วง'}});
unordered_map<const char*, const char*>umap2(umap1);

องค์ประกอบคู่

รหัสต่อไปนี้แสดงวิธีสร้างและเข้าถึงองค์ประกอบคู่:

คู่<char, const char*>pr= {'NS', 'เป็น'};
ค่าใช้จ่าย<<ประชาสัมพันธ์แรก << 'NS';
ค่าใช้จ่าย<<ประชาสัมพันธ์ที่สอง << 'NS';

ผลลัพธ์คือ:

NS
เป็น

ที่หนึ่งและสองเป็นคำสงวนสำหรับสองรายการในคู่ ค่าในคู่เงินยังคงสามารถเปลี่ยนแปลงได้โดยใช้ค่าที่หนึ่งและค่าที่สอง

มีการเรียกคู่ value_type ในหัวข้อของแผนที่ที่ไม่เรียงลำดับ

unordered_map การเข้าถึงองค์ประกอบ

mapped_type& โอเปอเรเตอร์[](key_type&& k)
ส่งคืนค่าสำหรับคีย์ที่เกี่ยวข้อง ตัวอย่าง:

unordered_map<const char*, const char*>อุมัป;

อุมัป['กล้วย'] = 'สีเหลือง';
อุมัป['องุ่น'] = 'เขียว';
อุมัป['รูปที่'] = 'สีม่วง';

const char *ขวา=อุมัป['องุ่น'];

ค่าใช้จ่าย<<ขวา<<'NS';

ผลลัพธ์คือ: สีเขียว สามารถกำหนดค่าได้ในลักษณะเดียวกัน – ดูด้านบน

unordered_map ความจุ

size_type size() const noexcept
ส่งกลับจำนวนคู่ในแผนที่

unordered_map<const char*, const char*>อุมัป;

อุมัป['กล้วย'] = 'สีเหลือง';
อุมัป['องุ่น'] = 'เขียว';
อุมัป['รูปที่'] = 'สีม่วง';

ค่าใช้จ่าย<<อุมัปขนาด() <<'NS';

ผลลัพธ์คือ 3

bool ว่างเปล่า () const noexcept

คืนค่า 1 สำหรับ true หากแผนที่ไม่มีคู่ และ 0 สำหรับ false หากมีคู่ ตัวอย่าง:

unordered_map<const char*, const char*>อุมัป;
ค่าใช้จ่าย<<อุมัปว่างเปล่า() <<'NS';

ผลลัพธ์คือ 1

การกลับมาของ Iterators และ Class ที่ไม่เรียงลำดับแผนที่

ตัววนซ้ำเป็นเหมือนตัวชี้ แต่มีฟังก์ชันการทำงานมากกว่าตัวชี้

เริ่มต้น () ไม่มีข้อยกเว้น

ส่งกลับตัววนซ้ำที่ชี้ไปที่คู่แรกของวัตถุแผนที่ ดังในส่วนรหัสต่อไปนี้:

unordered_map<const char*, const char*>อุมัป;

อุมัป['กล้วย'] = 'สีเหลือง';อุมัป['องุ่น'] = 'เขียว';อุมัป['รูปที่'] = 'สีม่วง';

unordered_map<const char*, const char*> ::iteratoriter=อุมัปเริ่ม();
คู่<const char*, const char*>pr= *iter;
ค่าใช้จ่าย<<ประชาสัมพันธ์แรก << ',' <<ประชาสัมพันธ์ที่สอง << 'NS';

ผลลัพธ์คือ: มะเดื่อ สีม่วง แผนที่ไม่ได้เรียงลำดับ

start() const noexcept;

ส่งกลับตัววนซ้ำที่ชี้ไปที่องค์ประกอบแรกของการรวบรวมวัตถุแผนที่ เมื่อการสร้างวัตถุนำหน้าด้วย const นิพจน์ begin() const จะถูกดำเนินการแทน start() ภายใต้เงื่อนไขนี้ องค์ประกอบในวัตถุไม่สามารถแก้ไขได้ มันถูกใช้ในรหัสต่อไปนี้เช่น

constunordered_map<const char*, const char*>อุมัป({{'กล้วย', 'สีเหลือง'},
{'องุ่น', 'เขียว'}, {'รูปที่', 'สีม่วง'}});

unordered_map<const char*, const char*> ::const_iteratoriter=อุมัปเริ่ม();
คู่<const char*, const char*>pr= *iter;
ค่าใช้จ่าย<<ประชาสัมพันธ์แรก << ',' <<ประชาสัมพันธ์ที่สอง << 'NS';

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

end() noexcept

ส่งกลับตัววนซ้ำที่ชี้ทันทีเกินองค์ประกอบสุดท้ายของวัตถุแผนที่

end() const noexcept

ส่งกลับตัววนซ้ำที่ชี้ทันทีเกินองค์ประกอบสุดท้ายของวัตถุแผนที่ เมื่อการสร้างวัตถุแผนที่นำหน้าด้วย const นิพจน์ end() const จะถูกดำเนินการแทน end()

unordered_map การดำเนินงาน

ค้นหาตัววนซ้ำ (const key_type& k)

ค้นหาคู่ของคีย์ที่ระบุในแผนที่ หากพบ จะส่งกลับตัววนซ้ำ หากไม่พบ ระบบจะส่งคืนตัววนซ้ำที่ชี้ไปยังจุดสิ้นสุดของแผนที่ ซึ่งไม่ใช่คู่ รหัสต่อไปนี้แสดงวิธีการใช้ฟังก์ชันสมาชิกนี้:

unordered_map<char,char>อุมัป;

อุมัป['ถึง'] = 'NS';อุมัป['ค'] = 'NS';อุมัป['และ'] = 'NS';

unordered_map<char,char> ::iteratoriter=อุมัปหา('ค');
ถ้า (อุมัปหา('ค') ! =อุแมปจบ())
{
คู่<char,char>pr= *iter;
ค่าใช้จ่าย<<ประชาสัมพันธ์แรก << ',' <<ประชาสัมพันธ์ที่สอง << 'NS';
}

ผลลัพธ์คือ: c, d

const_iterator ค้นหา (const key_type& k) const;

เวอร์ชันของฟังก์ชันนี้ถูกเรียก หากการสร้างแผนที่ที่ไม่เรียงลำดับเริ่มต้นด้วย const ทำให้องค์ประกอบทั้งหมดของแผนที่เป็นแบบอ่านอย่างเดียว

unordered_map ตัวดัดแปลง

แทรกคู่ (value_type&& obj)
แผนที่ที่ไม่เรียงลำดับหมายความว่าทั้งคู่ไม่อยู่ในลำดับใดๆ ดังนั้นโปรแกรมจะแทรกคู่ในที่ใด ๆ ที่สะดวก ฟังก์ชันส่งคืน, คู่ หากการแทรกสำเร็จ bool จะเป็น 1 สำหรับ true ไม่เช่นนั้นจะเป็น 0 สำหรับ false หากการแทรกสำเร็จ ตัววนซ้ำจะชี้ไปที่องค์ประกอบที่แทรกใหม่ รหัสต่อไปนี้แสดงให้เห็นถึงการใช้งาน:

unordered_map<const char*, const char*>อุมัป;

อุมัป['กล้วย'] = 'สีเหลือง';
อุมัป['องุ่น'] = 'เขียว';
อุมัป['รูปที่'] = 'สีม่วง';

อุมัปแทรก({{'เชอร์รี่', 'สุทธิ'}, {'สตรอเบอร์รี่', 'สุทธิ'}});

ค่าใช้จ่าย<<อุมัปขนาด() << 'NS';

ผลลัพธ์คือ: 5. สามารถแทรกได้มากกว่าหนึ่งคู่

size_type ลบ (const key_type& k)

ฟังก์ชันนี้จะลบคู่ออกจาก unordered_map ส่วนรหัสต่อไปนี้แสดงให้เห็น:

unordered_map<const char*, const char*>อุมัป;

อุมัป['กล้วย'] = 'สีเหลือง';
อุมัป['องุ่น'] = 'เขียว';
อุมัป['รูปที่'] = 'สีม่วง';

intหนึ่ง=อุมัปลบ('องุ่น');

ค่าใช้จ่าย<<อุมัปขนาด() << 'NS';

ผลลัพธ์คือ 2
โมฆะ swap(unordered_map&)
สามารถสลับแผนที่ที่ไม่เรียงลำดับสองแผนที่ ดังที่แสดงในส่วนรหัสนี้:

unordered_map<const char*, const char*>umap1= {{'กล้วย', 'สีเหลือง'},
{'องุ่น', 'เขียว'}, {'รูปที่', 'สีม่วง'}, {'สตรอเบอร์รี่', 'สุทธิ'}};

unordered_map<const char*, const char*>umap2= {{'เชอร์รี่', 'สุทธิ'}, {'มะนาว', 'เขียว'}};

อุแมป1แลกเปลี่ยน(umap2);

unordered_map<const char*, const char*> ::iteratoriter1=อุแมป1เริ่ม();
คู่<const char*, const char*>pr1= *iter1;
unordered_map<const char*, const char*> ::iteratoriter2=อุแมป2เริ่ม();
คู่<const char*, const char*>pr2= *iter2;

ค่าใช้จ่าย<< 'คีย์แรกและขนาดของ umap1:'<<pr1.แรก <<','<<อุแมป1ขนาด() << 'NS';
ค่าใช้จ่าย<< 'คีย์แรกและขนาดของ umap2'<<pr2.แรก <<','<<อุแมป2ขนาด() << 'NS';
unordered_map<const char*, const char*>umap1= {{'กล้วย', 'สีเหลือง'},
{'องุ่น', 'เขียว'}, {'รูปที่', 'สีม่วง'}, {'สตรอเบอร์รี่', 'สุทธิ'}};
unordered_map<const char*, const char*>umap2= {{'เชอร์รี่', 'สุทธิ'}, {'มะนาว', 'เขียว'}};

อุแมป1แลกเปลี่ยน(umap2);

unordered_map<const char*, const char*> ::iteratoriter1=อุแมป1เริ่ม();
คู่<const char*, const char*>pr1= *iter1;
unordered_map<const char*, const char*> ::iteratoriter2=อุแมป2เริ่ม();
คู่<const char*, const char*>pr2= *iter2;

ค่าใช้จ่าย<< 'คีย์แรกและขนาดของ umap1:'<<pr1.แรก <<','<<อุแมป1ขนาด() << 'NS';
ค่าใช้จ่าย<< 'คีย์แรกและขนาดของ umap2'<<pr2.แรก <<','<<อุแมป2ขนาด() << 'NS';

ผลลัพธ์คือ:

คีย์แรกและขนาดของ umap1: lime, 2

กุญแจแรกและขนาดของสตรอเบอร์รี่ umap2 4

แผนที่ไม่ได้เรียงลำดับ โปรดทราบว่าความยาวของแผนที่จะเพิ่มขึ้นหากจำเป็น ชนิดข้อมูลจะต้องเหมือนกัน

คลาสและออบเจกต์ที่สร้างอินสแตนซ์

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

#รวม
#รวม
ใช้เนมสเปซ std;

คลาส TheCla
{
สาธารณะ:
intหนึ่ง;
คงที่ charch;

โมฆะการทำงาน(charไม่, const char *NS)
{
ค่าใช้จ่าย<< 'มี' <<หนึ่ง<< 'หนังสือคุ้ม' <<ไม่<<NS<< ' ในร้าน.' << 'NS';
}
คงที่ โมฆะสนุก(charch)
{
ถ้า (ch== 'ถึง')
ค่าใช้จ่าย<< 'ฟังก์ชั่นสมาชิกคงที่อย่างเป็นทางการ' << 'NS';
}
};

intหลัก()
{
TheCla obj1;TheCla obj2;TheCla obj3;TheCla obj4;TheCla obj5;

unordered_map<const char*,TheCla>อุมัป;
อุมัป= {{'กล้วย',obj1}, {'องุ่น',obj2}, {'รูปที่',obj3}, {'สตรอเบอร์รี่',obj4}, {'มะนาว',obj5}};

ค่าใช้จ่าย<<อุมัปขนาด() << 'NS';

กลับ 0;
}

ผลลัพธ์คือ: 5.

นิยามคลาสมีสมาชิกสาธารณะข้อมูลสองรายการและฟังก์ชันสมาชิกสาธารณะสองรายการ ในฟังก์ชัน main() อ็อบเจ็กต์ต่างๆ สำหรับคลาสจะถูกสร้างอินสแตนซ์ แผนที่ที่ไม่เรียงลำดับจะถูกสร้างอินสแตนซ์ โดยที่แต่ละคู่ประกอบด้วยชื่อของผลไม้และวัตถุจากชั้นเรียน ขนาดของแผนที่จะปรากฏขึ้น โปรแกรมคอมไพล์โดยไม่มีคำเตือนหรือข้อความแสดงข้อผิดพลาด

แอพลิเคชันของแผนที่

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

การก่อตัวของแผนที่

แผนที่ไม่ใช่อาร์เรย์สองมิติที่มีสองคอลัมน์ แผนที่ทำงานร่วมกับฟังก์ชันแฮช คีย์ถูกเข้ารหัสโดยฟังก์ชันแฮช เป็นจำนวนเต็มของอาร์เรย์ เป็นอาร์เรย์นี้ที่เก็บค่า ดังนั้นจึงมีอาร์เรย์หนึ่งที่มีค่า และคีย์ถูกแมปกับดัชนีของอาร์เรย์ ดังนั้นจึงมีการโต้ตอบกันระหว่างคีย์และค่าต่างๆ Hashing เป็นหัวข้อที่ครอบคลุมและไม่ได้กล่าวถึงในบทความนี้

บทสรุป

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

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

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

ฟังก์ชันสมาชิกและตัวดำเนินการสำหรับ unordered_map สามารถจัดหมวดหมู่ได้ภายใต้หัวข้อต่อไปนี้: unordered_map construction/copy constructing, unordered_map Capacity, unordered_map iterator, unordered_map Operations และ unordered_map Modifiers

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

คริส