บทความนี้อธิบายการทำงาน ไวยากรณ์ และตัวอย่างของออพเรเตอร์ map::operator[] ใน C++ STL
Map ใน C++ STL คืออะไร?
Map เป็นคอนเทนเนอร์แบบ associative ที่จัดเก็บข้อมูลเป็นคู่คีย์-ค่า (key-value pairs) โดยจัดเรียงอัตโนมัติตามคีย์ คีย์แต่ละตัวเป็นเอกลักษณ์
map::operator[] คืออะไร?
map::operator[] เป็นออพเรเตอร์อ้างอิง (reference operator) ใช้เข้าถึงองค์ประกอบในคอนเทนเนอร์ผ่านคีย์
พฤติกรรมสำคัญ:
- หากคีย์มีอยู่ – ส่งคืน reference ของค่าที่เกี่ยวข้อง
- หากคีย์ ไม่มีอยู่ – จะ แทรกคีย์ใหม่พร้อมค่าเริ่มต้น (value-initialized) และส่งคืน reference ของค่าใหม่นั้น
แตกต่างจาก map::at() ซึ่งจะโยน exception (out_of_range) หากคีย์ไม่มีอยู่
ไวยากรณ์ (Syntax)
map_name[key];
พารามิเตอร์
key – คีย์ที่ต้องการอ้างอิงในคอนเทนเนอร์
ค่าที่ส่งคืน
ส่งคืน reference ของค่าที่เชื่อมโยงกับคีย์ (สามารถอ่าน/เขียนได้)
ตัวอย่าง Input/Output
Input:
map<char, int> newmap;
newmap.insert({1, 20});
newmap.insert({2, 30});
newmap[1];
Output:
20
ตัวอย่างโค้ดที่ 1: การเข้าถึงและแก้ไขค่า
#include <bits/stdc++.h>
using namespace std;
int main() {
map<int, int> TP_1;
// แทรกค่าใช้ operator[]
TP_1[1] = 10;
TP_1[2] = 20;
TP_1[3] = 30;
TP_1[4] = 40;
// อ่านค่า
cout << "Element at TP[3] is: " << TP_1[3] << endl;
// แก้ไขค่า
TP_1[3] = 99;
cout << "After modify TP[3]: " << TP_1[3] << endl;
return 0;
}
ผลลัพธ์
Element at TP[3] is: 30 After modify TP[3]: 99
ตัวอย่างโค้ดที่ 2: พฤติกรรมเมื่อคีย์ไม่มีอยู่
#include <bits/stdc++.h>
using namespace std;
int main() {
map<int, int> TP_1;
TP_1[1] = 10;
TP_1[2] = 20;
TP_1[3] = 30;
TP_1[4] = 40;
cout << "Element at TP[3] is: " << TP_1[3] << endl;
// TP[5] ไม่มีอยู่ -> จะถูกสร้างใหม่ด้วยค่า 0 (int())
if (TP_1[5] == 0) {
cout << "Element at TP[5] doesn't exist (auto-created with value 0)" << endl;
} else {
cout << "Element at TP[5] is: " << TP_1[5] << endl;
}
// ตอนนี้ TP_1 มีคีย์ 5 แล้ว
cout << "Map size: " << TP_1.size() << endl; // จะได้ 5
return 0;
}
ผลลัพธ์
Element at TP[3] is: 30 Element at TP[5] doesn't exist (auto-created with value 0) Map size: 5
ข้อควรระวัง (Gotchas)
- Side effect: การใช้
operator[]เพื่อ "ตรวจสอบ" คีย์จะทำให้คีย์นั้นถูกสร้างขึ้นมา (insert) ทันที – อาจไม่ใช่เจตนาของโปรแกรมเมอร์ - หากต้องการตรวจสอบอย่างเดียวโดยไม่แทรก ให้ใช้
find()หรือcount()แทน operator[]ไม่สามารถใช้กับconst mapได้ (เพราะอาจเปลี่ยนแปลง map)
สรุปการเปรียบเทียบ
| ออพเรเตอร์/ฟังก์ชัน | คีย์มีอยู่ | คีย์ไม่มีอยู่ | ใช้กับ const map ได้ไหม |
|---|---|---|---|
operator[] | คืน reference | แทรกค่าใหม่ (default) คืน reference | ไม่ได้ |
at() | คืน reference | โยน exception | ได้ |
find() | คืน iterator | คืน end() | ได้ |
count() | คืน 1 | คืน 0 | ได้ |