Map

Map adalah tipe data yang terdapat dalam STL. Cara penyimpanan di dalam key mirip dengan Associative Array dalam bahasa PHP. Isi map bisa diakses dengan menggunakan key yang ditulis seperti indeks array. Key tidak harus berupa string, kalian bisa menggunakan tipe data lainnya, terutama tipe data dasar.

Untuk menggunakan map pada C++ kalian perlu menambahkan "#include <map>". Berikut ini adalah contoh kode programnya.

#include <iostream>
#include <map>

using namespace std;

int main(){
std::map<string, int> mapku;

    //Isi map
    mapku.insert(pair<string, int>("satu", 1));
    mapku.insert(pair<string, int>("dua", 2));
    mapku.insert(pair<string, int>("tiga", 3));
    mapku.insert(pair<string, int>("empat", 4));
    mapku.insert(pair<string, int>("lima", 5));

    mapku["enam"]=6;
    cout << "Ukuran : " << mapku.size();
    cout << endl;
    
    cout << "Isi : ";
    cout << mapku.at("satu") << " ";
    cout << mapku.at("dua") << " ";
    cout << mapku.at("tiga") << " ";
    cout << mapku.at("empat") << " ";
    cout << mapku.at("lima") << " ";
    
    mapku.clear();//Bersihkan map

    return 0;
}
Output :
Ukuran : 6
Isi : 1 2 3 4 5

Contoh kode program di atas menggunakan map yang key-nya bertipe string tipe, dan nilainya bertipe int. Tipe data pada deklarasi map menggunakan tipe data key dan nilainya yang diapit dengan tanda "<" dan ">". Pada kode program di atas, kita menambahkan data pada map dengan menggunakan function insert dan menampilkannya dengan menggunakan cout. 

Isi dari map bisa diakses dengan cara yang sama seperti array, yaitu menggunakan tanda "kurung kotak". Selain itu, kita bisa juga menggunakan at. "map<string, int> mapku" bisa diganti dengan "map<tipe_data_key, tipe_data_nilai> nama_variabel". Kalian bisa menggunakan map dengan tipe data lain selain tipe data int. Keynya juga tidak harus bertipe string.

Menampilkan Semua Data

Untuk menampilkan beberapa data sekaligus, kalian membutuhkan iterator yang digeser posisi pointernya dengan operator increment (++) di dalam for. Kalian juga membutuhkan method begin dan end untuk menampilkan data sesuai urutan aslinya. Jika kalian ingin menampilkan data secara terbalik, kalian bisa menggunakan rbegin dan rend.

#include <iostream>
#include <map>

using namespace std;

int main(){
    map<float, string> mapku=
    { {1.5, "ab"}, {2, "aa"}, {2.5, "bc"}, {3, "cd"}, {4, "de"} };

    mapku.erase(2);

    cout << "Data (asli) : " << endl;
    for (auto p = mapku.begin(); p != mapku.end(); ++p)
        cout << p->first << " dan " << p->second << endl;

    cout << "Data (terbalik) : " << endl;
    for (auto p = mapku.rbegin(); p != mapku.rend(); ++p)
        cout << p->first << " dan " << p->second << endl;

    return 0;
}
Output :
Data (asli) :
1.5 dan ab
2.5 dan bc
3 dan cd
4 dan de
Data (terbalik) :
4 dan de
3 dan cd
2.5 dan bc
1.5 dan ab

Inisiasi map hampir sama dengan array 2d. Tipenya harus sesuai key dan value saat deklarasi map. Kalian bisa menggunakan for dengan iterator (dengan tipe data auto) untuk melihat semua isi map. Karena map memiliki dua anggota, iteratornya memerlukan method first dan second.

Kalian bisa menambah data map dengan menggunakan method insert. Sebaliknya, kalian bisa menggunakan erase untuk menghapus isi map berdasarkan keynya. Untuk mendapatkan data pada posisi tertentu, kalian bisa menggunakan method at.

Beberapa method yang biasa digunakan dalam map adalah sebagai berikut :

  1. insert => Menambahkan data.
  2. erase => Menghapus data sesuai keynya.
  3. at => Menunjukan nilai dari data yang terdapat dalam map sesuai keynya.
  4. front => Menunjukkan nilai data pada elemen pertama dalam map. 
  5. back => Menunjukkan nilai data pada elemen terakhir dalam map
  6. size => Mengembalikan nilai berupa ukuran map
  7. find => Mengembalikan pointer map dengan key yang dicari, jika ada.
  8. max_size => Mengembalikan ukuran maksimum yang bisa dicapai map berdasarkan batasan sistem disaat memori masih tersedia.
  9. clear => Mengosongkan map
  10. begin => Mengembalikan iterator berupa pointer yang menunjuk nilai pertama dari map.
  11. end => Mengembalikan iterator berupa pointer yang menunjuk akhir dari map.

Unordered Map

Unordered_map adalah versi lain dari map. Bedanya ada di cara penyimpanannya. Unordered_map tidak akan mengurutan isi berdasarkan key-nya. Itu berbeda dengan map yang akan mengurutkan key walaupun inisiasinya acak. Supaya lebih mudah untuk memahaminya, lebih baik kalian langsung buat kode program pembanding kedua jenis container tersebut.

#include <iostream>
#include <map>
#include <unordered_map>

using namespace std;

int main(){
    map<float, string> map1=
    { {1.5, "db"}, {3.2, "za"}, {2.5, "bc"}, {3, "cd"}, {4, "de"} };
    
    unordered_map<float, string> map2=
    { {1.5, "db"}, {3.2, "za"}, {2.5, "bc"}, {3, "cd"}, {4, "de"} };

    cout << "ordered : " << endl;
    for (auto p = map1.begin(); p != map1.end(); ++p)
        cout << p->first << " dan " << p->second << endl;
    cout << "Unordered : " << endl;
    for (auto p = map2.begin(); p != map2.end(); ++p)
        cout << p->first << " dan " << p->second << endl;

    return 0;
}
Output :
ordered :
1.5 dan db
2.5 dan bc
3 dan cd
3.2 dan za
4 dan de
Unordered :
4 dan de
3 dan cd
2.5 dan bc
3.2 dan za
1.5 dan db
Untuk menggunakan unordered map kalian harus menyertakan header <unordered_map>.

Multimap

Selain map dan unordered_map, STL juga menyediakan multimap yang cara penyimpanannya relatif sama dengan map. Header yang dibutuhkan juga sama dengan map. Bedanya, multimap bisa menyimpan dua key yang sama.
#include <iostream>
#include <map>

using namespace std;

int main(){
    multimap<float, string> mapku=
    { {1.5, "ab"}, {2, "aa"}, {2, "xx"}, {2.5, "bc"}, {2.5, "bc"}, {3, "cd"}, {4, "de"} };
    mapku.insert(pair<float, string> (1.5, "zzz"));
    mapku.erase(2);

    for (auto p = mapku.begin(); p != mapku.end(); ++p)
        std::cout << p->first << " dan " << p->second << endl;

    return 0;
}
Multimap tidak bisa diakses isinya dengan at maupun operator []. Untuk mengecek isinya, kalian perlu menggunakan loop.