Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ออพเรเตอร์ map::operator[] ใน C++ STL

บทความนี้อธิบายการทำงาน ไวยากรณ์ และตัวอย่างของออพเรเตอร์ 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ได้