Sunday, October 8, 2017

Kuliah 13 C++: Kontainer Runtun: vector, list, dan deque



BAB 13.
Kontainer Runtun: vector, list, dan deque






13.1 Pengantar
Beberapa fitur dari kontainer telah didiskusikan pada Bab 12. Kontainer runtun terdiri-dari tiga kontainer, yaitu vector, list, dan deque (double ended queue). Fitur-fitur komparatif dari ketiganya ditampilkan pada Tabel 13.1.

TABEL 13.1 Sejumlah fitur dari kontainer vector, list, dan deque
vector
file header <vector>
list
file header <list>
deque
file header <deque>
Mendukung iterator acak. Akses cepat terhadap sembarang elemen.
Mendukung iterator dwi-arah (bidirectional). Iterator dapat diinkremen atau didekremen.
Mendukung iterator acak. Akses cepat terhadap sembarang elemen di dalam deque.
Karena mendukung iterator acak, semua algoritma STL dapat digunakan pada vector.
Algoritma-algoritma STL untuk membaca/menyimpan/menampilkan, dan iterator maju (forward) dan iterator dwi-arah dapat diterapkan pada list.
Karena mendukung iterator acak, semua algoritma STL dapat digunakan pada deque.
Penyisipan dan penghapusan cepat di ujung belakang vector.
Penyisipan dan penghapusan cepat di mana saja di dalam list.
Penyisipan dan penghapusan cepat di kedua ujung deque.
Data disimpan pada lokasi-lokasi memori secara sekuensial seperti array.
Struktur data semacam senarai berantai ganda (doubly linked list).
Berbasis struktur data seperti array. Akses langsung dilakukan menggunakan operator indeks.
Fungsi-fungsi yang umum digunakan dicantumkan pada Tabel 13.2.
Fungsi-fungsi yang umum digunakan dicantumkan pada Tabel 13.3 dan Tabel 13.4.
Fungsi-fungsi yang umum digunakan dicantumkan pada Tabel 13.5.



13.2 Kelas vector
DEKLARASI VEKTOR
Seperti yang telah disebutkan, kelas vector merupakan sebuah kelas kontainer dan elemen-elemennya disimpan di dalam lokasi-lokasi memori secara sekuensial seperti array. Vektor di dalam C++ tidak sama dengan vektor dalam Matematika meskipun beberapa konsep ada kesamaan. Vektor C++ dapat memiliki sembarang banyak komponen.

Vektor dipandang sebagai array yang lebih handal dan dinamis. Di samping itu, kelas vector mendukung banyak fungsi yang tidak bisa diterapkan pada array-array berbasis pointer seperti operasi penyisipan dan penghapusan elemen. Vektor merupakan sebuah array dinamis karena ia dapat mengalokasikan memori tambahan secara mandiri bila diperlukan saat adanya penambahan elemen. Pada saat permulaan, alokasi memori yang diberikan kecil yang cukup untuk beberapa elemen saja. Jika jumlah elemen bertambah selama eksekusi program, vektor akan mengalokasikan segmen memori tambahan yang lebih besar. Sementara itu, array memiliki panjang runtun yang tetap (jumlah elemen tetap saat deklarasi). Pada kasus array, elemen individu dapat ditugaskan, sedangkan array secara menyeluruh tidak dapat ditugaskan. Vektor dapat ditugaskan secara menyeluruh. Agar dapat bekerja dengan vektor, Anda perlu mencantumkan file header <vector> dan perlu mendeklarasikan tipe data dari elemen-elemen vektor, seperti int, double, char, atau lainnya di dalam kurung siku (<>). Beberapa contoh deklarasi vektor diberikan sebagai berikut:

#include <vector>    //File header
vector <int> V1;     //V1 adalah vektor dengan elemen-elemen int
vector <double> V2; //V2 adalah vektor dengan elemen-elemen double
vector <char> Vekt; //Vekt adalah vektor dengan elemen-elemen char

Pada deklarasi-deklarasi tersebut, V1, V2, dan Vekt merupakan pengenal atau nama vektor. Elemen-elemen dari vektor V1 bertipe int, elemen-elemen dari vektor V2 bertipe double, dan elemen-elemen dari vektor Vekt bertipe char.

Lebih dari satu vektor dapat dideklarasikan pada baris yang sama jika tipenya sama. Anda perlu menuliskan tipe data di dalam kurung siku hanya sekali saja setelah nama kelas vector. Sebagai contoh, Anda dapat mendeklarasikan sejumlah vektor sebagai berikut:

vector <int> V1, V3 ;
vector <double> A, B, C ;


KONSTRUKTOR DAN DESTRUKTOR DARI KELAS vector
Kelas vector memiliki sejumlah konstruktor. Konstruktor-konstruktor tersebut diberikan sebagai berikut:

vector <double> V(5);      /*Menciptakan sebuah vektor dengan 5 elemen bertipe
  double dan nilai 0*/

vector <int> V1(4,35);     /*Menciptakan V1 dengan 4 elemen bertipe int dan
  nilai 35*/

vector <int> V4 (V1);      //Menciptakan vektor V4 sebagai salinan dari vektor V1

vector <char> V2 ( 4, ‘D’) ;      /*Menciptakan vektor V2 dengan 4 elemen bertipe char dan
  nilai ‘D’*/

~vector ();                /*Destruktor dari kelas vector, yang menghapus semua
  elemen dari vektor*/


Program berikut mengilustrasikan sejumlah metode dalam menciptakan vektor. Pengaksesan elemen vektor dilakukan dengan menggunakan operator [], seperti yang dilakukan pada array.

Program 13.1 Mengilustrasikan konstruksi dari vektor dan menampilkan elemen-elemennya

#include<iostream>
#include<vector>
using namespace std;

vector <double> V(4);             // ukuran = 4, nilai masing-masing elemen = 0
vector <int> V1(4,35);            // ukuran = 4, nilai masing-masing elemen = 35

int main()
{
   vector<double> V2(4, 4.5);     //ukuran = 4, nilai masing-masing elemen = 4.5
   vector<char> V3(4, 'B'); //vektor V3 memiliki empat elemen,
                           //dengan nilai masing-masing elemen adalah ‘B’.

   vector<int> V4(V1);             //V4 adalah salinan dari V1
   vector<int> V5 ;

   for(int i =0; i<4;i++ )        //Menciptakan sebuah vektor dengan 4 elemen.
      V5.push_back (5);           //Masing-masing elemen bernilai 5.

   cout<<"V \tV1\tV2\tV3 \tV4"<<"\tV5"<<endl;
   for (int j = 0; j< 4; j++)             // loop for untuk menampilkan keluaran
      cout <<V[j]<<"\t"<< V1[j]<<"\t" <<V2[j]<<"\t"<< V3[j] <<"\t"<<
             V4[j]<<"\t"<<V5[j]<<endl ;

   return 0;
}
KELUARAN
V       V1      V2      V3      V4      V5
0       35      4.5     B       35      5
0       35      4.5     B       35      5
0       35      4.5     B       35      5
0       35      4.5     B       35      5

Vektor V memiliki 4 elemen, yang masing-masing bernilai 0, vektor V1, V2, dan V3 dikonstruksi dengan cara yang sama. Nilai-nilai elemen dari ketiganya adalah 35, 4.5, dan ‘B’. Vektor V4 merupakan salinan dari V1. Vektor V5 dikonstruksi menggunakan fungsi push_back(). Fungsi ini menambahkan elemen-elemen di belakang vektor. Pada kasus ini, semua nilai yang ditempatkan ke dalam vektor adalah 5.



13.3 Fungsi-Fungsi dari Kelas vector
Ada sejumlah fungsi dari kelas vector yang dapat dipakai untuk memanipulasi elemen-elemen runtun. Sejumlah fungsi tersebut diberikan pada Tabel 13.2.

TABEL 13.1 Fungsi-fungsi yang didukung oleh kelas vector
No
Fungsi
Penjelasan
1
assign()
Fungsi ini menugaskan nilai-nilai kepada sebuah vektor dari awal sampai akhir. Fungsi ini juga digunakan untuk menugaskan sejumlah salinan dari suatu nilai kepada sebuah vektor. Isi sebelumnya di dalam vektor akan dihapus.
2
at()
Fungsi ini menghasilkan sebuah referensi yang menunjuk ke suatu elemen di dalam sebuah vektor pada lokasi yang ditetapkan (dituliskan di dalam kurung siku).
3
back()
Fungsi ini menghasilkan referensi yang menunjuk ke elemen terakhir di dalam vektor.
4
begin()
Fungsi ini menghasilkan referensi yang menunjuk ke elemen pertama di dalam vektor.
5
capacity()
Fungsi ini menghasilkan jumlah elemen yang dapat ditampung oleh vektor pada alokasi memori terkini. Jumlah elemen tersebut bukanlah jumlah elemen aktual di dalam vektor.
6
clear()
Fungsi ini menghapus semua elemen di dalam vektor.
7
empty()
Fungsi ini menghasilkan true jika tidak ada elemen di dalam vektor, sebaliknya menghasilkan false.
8
end()
Fungsi ini menghasilkan iterator yang menunjuk ke posisi setelah akhir vektor.
9
erase()
Fungsi ini menghapus elemen pada lokasi berindeks atau menghapus elemen-elemen di antara iterator awal dan iterator akhir. Elemen awal (yang ditunjuk oleh iterator) termasuk yang dihapus tetapi elemen akhir (yang ditunjuk oleh iterator) tidak dihapus.
10
front()
Fungsi ini menghasilkan sebuah referensi yang menunjuk ke elemen pertama di dalam vektor.
11
insert()
Fungsi ini menyisipkan elemen-elemen di dalam vektor: yaitu (i) satu nilai atau (ii) sejumlah salinan dari sebuah nilai pada lokasi tertentu, (iii) menyisipkan dari awal sampai akhir tepat sebelum sebuah lokasi.
12
max_size()
Menghasilkan jumlah elemen maksimum yang dapat ditampung oleh sebuah vektor.
13
pop_back()
Menghapus elemen akhir di dalam vektor.
14
push_back()
Menempakan elemen di belakang vektor.
15
rbegin()
Menghasilkan sebuah iterator balik ke akhir vektor.
16
rend()
Menghasilkan sebuah iterator balik ke awal vektor.
17
reserve()
Mengubah kapasitas vektor menjadi ukuran terkecil.
18
resize()
Mengubah ukuran vektor menjadi ukuran yang ditetapkan.
19
size()
Menghasilkan jumlah elemen terkini di dalam vektor.
20
swap()
Menukar isi dari dua vektor.



13.4 Definisi dan Aplikasi dari Iterator
Iterator itu seperti pointer. Iterator dipakai untuk menjelajah elemen-elemen dari sebuah vektor. Deklarasi dari iterator, katakanlah, untuk vektor V1 yang bertipe int diilustrasikan berikut. Pada deklarasi berikut,  iterator tersebut diinisialisasi dengan V1.begin(), yaitu nilai yang berkaitan dengan elemen pertama dari vektor V1.


GAMBAR 13.1 Deklarasi dan penugasan iterator


Sesuai dengan deklarasi pada gambar di atas, Iter adalah nama iterator. Iterator ini diinisialisasi dengan nilai yang berkaitan dengan elemen pertama pada vektor. Nilai itu dapat diinkremen untuk menjangkau elemen-elemen lain pada vektor. Jadi, Iter + 1 akan menunjuk ke elemen kedua pada vektor. Sama halnya, Iter + 2 menunjuk ke elemen ketiga dan seterusnya. Anda perlu mengetahui bahwa V1.end() menunjuk ke posisi setelah elemen terakhir dari vektor. Nilai-nilai elemen di dalam vektor juga dapat diperoleh menggunakan operator dereferensi (*). Jadi, nilai dari elemen pertama pada vektor adalah *Iter, nilai dari elemen kedua adalah *(Iter + 1), dan seterusnya. Lihat program berikut untuk ilustrasi.

Program 13.2 Mengilustrasikan konstruksi dari vektor dan menampilkan elemen-elemennya

#include<iostream>
#include<vector>
using namespace std;

vector<int> V1, V2 ; //deklarasi dari dua vektor

int main()
{
   V1.push_back(10); //Menggunakan fungsi push_back() untuk menciptakan V1
   V1.push_back(20);
   V1.push_back(30);

   vector<int> :: iterator iter = V1.begin();   //iterator untuk V1

   cout<<*iter<<"\t"<<*(iter+1)<<"\t"<<*(iter +2) <<endl;
   cout<<iter<<"\t"<<iter+1<<"\t"<<iter+2 << endl;

   cout<<"Elemen-elemen dari vektor V2 adalah sebagai berikut:\n ";
   for (int i =0;i< 6; i++)
      V2.push_back(i*i);   //menciptakan vektor V2

   iter = V2.begin();             //iterator untuk V2

   while (iter != V2.end())
   {
      cout <<*iter <<" ";
      iter++;
   }

   cout<<endl;
   return 0;
}
KELUARAN
10              20              30
006616B0        006616B4        006616B8
Elemen-elemen dari vektor V2 adalah sebagai berikut:
0 1 4 9 16 25


Dengan bantuan fungsi push_back(), tiga elemen ditempatkan ke dalam V1. Elemen-elemen tersebut ditambahkan pada elemen-elemen yang telah ada. Nilai dari ketiga elemen tersebut adalah 10, 20, dan 30. Untuk menampilkan nilai dari ketiga elemen, iterator iter diinisialisasi dengan V1.begin(). Jadi, *iter adalah nilai dari elemen pertama, *(iter + 1) menghasilkan nilai dari elemen kedua, dan *(iter + 2) menghasilkan nilai dari elemen ketiga dan seterusnya. Nilai dari iter, iter + 1, dan iter + 2 adalah alamat-alamat dari elemen. Sama halnya, elemen-elemen dari V2 diekstrasi dengan bantuan loop dengan iterator iter.



13.5 Operator-Operator yang Didukung oleh Kelas vector
Dua vektor dapat dibandingkan dengan operator-operator seperti ==, >, <, >=, <=, dan !=. Sebuah vektor dapat ditugaskan kepada vektor lain sama seperti ketika Anda menugaskan variabel-variabel bertipe fundamental. Ini diilustrasikan sebagai berikut:

vector<int> V1(5, 50), V2;
V2 = V1;

Pada kode tersebut, dua vektor dideklarasikan. Vektor V1 diinisialisasi dengan 5 elemen yang bernilai 50. Vektor V1 ditugaskan kepada V2, jadi V2 menjadi salinan dari vektor V1. Ekualitas dari dua vektor dapat diuji menggunakan operator ==. Dua vektor dikatakan sama jika ukurannya sama dan setiap elemen vektor pertama pada lokasi i sama dengan elemen pada lokasi i dari vektor kedua. Operasi-operasi aritmatika juga bisa diterapkan pada elemen-elemen individual dari sebuah vektor. Program berikut mengilustrasikan aplikasi dari sejumlah operator ini.



13.6 Aplikasi dari Fungsi-Fungsi dari Kelas vector
Sejumlah fungsi yang didukung oleh kelas vector dicantumkan pada Tabel 13.2 berikut dengan penjelasan singkat tentang aksi masing-masing fungsi. Beberapa fungsi tersebut akan dijelaskan berikut.


FUNGSI assign()
Dimisalkan V adalah sebuah vektor, dimana ke dalamnya nilai-nilai akan ditugaskan. Jika semua komponen bernilai sama, maka Anda dapat menugaskan nilai-nilai sebagai berikut:

V.assign(6, 80);

Sesuai dengan kode tersebut, vektor V ditugasi 6 elemen dan setiap elemen memiliki nilai 80. Jadi, vektor V memiliki elemen-elemen 80, 80, 80, 80, 80, dan 80. Fungsi assign() menghapus elemen-elemen yang telah ada sebelumnya di dalam vektor. Fungsi push_back() juga bisa dipakai untuk menempatkan nilai-nilai ke dalam vektor. Fungsi itu menempatkan nilai-nilai (yang dituliskan di dalam kurung siku) di belakang vektor. Jadi, jika diinginkan untuk menambahkan sebuah elemen baru pada vektor V di belakang vektor, maka sintaksisnya adalah:

V.push_back(35);

Dengan penambahan 35, vektor V sekarang memiliki elemen-elemen 80, 80, 80, 80, 80, 80, dan 35.

Program 13.3 Mengilustrasikan aplikasi dari fungsi assign(), push_back(), dan sejumlah operator

#include<iostream>
#include<vector>
#include <string>
using namespace std;

vector<int> V1, V2, V3, V4;
vector<string> V5;

int main()
{
   V1.assign(5,5); //V1 is assigned 5 values each equal to 5.
   V2.assign(5,4); //V2 is assigned 5 values each equal to 4.

   V3 = V2; // vector V2 is assigned to vector V3

   string Str [] = {"Nimi" ,"Simi", "Jimmi", "Ginni", "Pinni"};

   int Array[] = {1, 2, 3, 4, 5};

   for (int j =0; j<5 ;j++)
   {
      V4.push_back (Array[j]);
      V5.push_back (Str[j]);
   }
   //elemen-elemen dari array Str ditempatkan ke vektor V5

   if(V2 == V3)
   {
      cout<<"V2 dan V3 sama"<<endl;
   }
   else
      cout<<" V2 dan V3 tidak sama"<<endl;

   cout<<"V1 \tV2 \tV3 \tV4 \t V5"<<endl ;
   for (int i = 0; i< 5; i++)
      cout<<V1[i]<<"\t"<<V2[i]<<"\t"<<V3[i]<<"\t"<<V4[i]<<"\t"<<V5[i]<<endl;

   cout<<"Alamat dari V3 = "<<&V3<<endl ;
   for (int k=0;k< 5 ;k++)
      V2[k] *= V1[k] ;

   cout<<"Komponen-komponen dari V2 sekarang = ";
   for (int m =0; m<5; m++)
      cout<<V2.at(m) <<" ";

   cout<<"\n";
   return 0;
}
KELUARAN
V2 dan V3 sama
V1      V2      V3      V4       V5
5       4       4       1       Nimi
5       4       4       2       Simi
5       4       4       3       Jimmi
5       4       4       4       Ginni
5       4       4       5       Pinni
Alamat dari V3 = 0047B780
Komponen-komponen dari V2 sekarang = 20 20 20 20 20


Pada program di atas, Anda memperoleh ilustrasi dari penggunaan fungsi assign() dan at(). Selain itu, program memiliki sebuah vektor, yang elemen-elemennya berupa string. Penampilan elemen-elemen vektor dilakukan oleh operator [] seperti array. Elemen-elemen individual dari sebuah vektor dapat dikenai operasi-operasi aritmatika sama seperti variabel biasa.


FUNGSI size() dan capacity()
Fungsi size() menghasilkan jumlah elemen aktual di dalam vektor, sedangkan fungsi capacity() menghasilkan jumlah elemen maksimum yang dapat dimuat oleh vektor dengan alokasi memori terkini. Vektor merupakan sebuah array dinamis, dimana ketika jumlah elemen bertambah melebihi kapasitas yang teralokasi, vektor akan diberikan tambahan memori yang lebih besar.

Program 13.4 Mengilustrasikan aplikasi dari fungsi size(), capacity(), end(), begin(), push_back(), pop_back()

#include<iostream>
#include<vector>
using namespace std;

vector<int> V;

int main()
{
   for (int i =1; i<=5;i++)
      V.push_back (i*i);   //5 nilai:1, 4, 9, 16, 25 ditempatkan ke dalam V
 
   cout<<"Ukuran dari V = "<< V.size()<<endl;
   cout<<"Kapasitas dari V = "<< V.capacity()<<endl;

   cout<<"Elemen-elemen dari vektor V adalah: "<<endl;
   for (int j = 0; j<=4; j++)
      cout <<" "<< V[j]<<" ";
   cout<<endl;

   V.pop_back(); //Elemen akhir (25) dihapus
   cout<<"Setelah pop_back, ukuran dari V adalah = "<<V.size()<<endl;

   cout<<"Kapasitas dari V = "<<V.capacity()<<endl;
   for (int k =1; k< 6; k++)
      V.push_back (2*k);   //5 nilai: (2, 4, 6, 8, 10) ditempatkan ke dalam V

   cout<<"Sekarang ukuran dari V adalah = "<<V.size();
   cout<<"\nSekarang kapasitas dari V adalah = "<< V.capacity();

   vector<int> :: iterator itr;          //deklarasi dari iterator itr

   cout<<"\nSetelah pop_back, elemen-elemen dari V adalah: "<<endl;
   for (itr = V.begin(); itr < V.end (); itr ++)
      cout<<*itr <<" " ; //menampilkan nilai dari tiap elemen dengan iterator

   cout<<endl;
   return 0;
}
KELUARAN
Ukuran dari V = 5
Kapasitas dari V = 8
Elemen-elemen dari vektor V adalah:
 1  4  9  16  25
Setelah pop_back, ukuran dari V adalah = 4
Kapasitas dari V = 8
Sekarang ukuran dari V adalah = 9
Sekarang kapasitas dari V adalah = 16
Setelah pop_back, elemen-elemen dari V adalah:
1 4 9 16 2 4 6 8 10


Keluaran program tersebut mengilustrasikan perbedaan antara fungsi capacity() dan fungsi size(). Fungsi capacity() menghasilkan jumlah elemen maksimum yang dapat dimuat oleh vektor dengan alokasi memori sekarang sedangkan fungsi size() menghasilkan jumlah elemen aktual. Vektor adalah array dinamis. Jumlah elemen dapat bertambah atua berkurang selama eksekusi program. Jika jumlah elemen bertambah dan vektor memerlukan lebih dari memori yang awalnya dialokasikan, maka vektor akan diberikan tambahan memori yang lebih besar. Pengalokasian ini dilakukan secara otomatis dan elemen-elemen yang telah ada disalin ke lokasi baru. Keluaran program tersebut menunjukkan bahwa ketika elemen bertambah menjadi 9, kapasitas bertambah dari 8 menjadi 16.

Fungsi push_back() menambahkan elemen di belakang vektor dan pop_back() menghapus elemen akhir dari vektor.


FUNGSI at()
Pada kasus array, tidak ada pemeriksaan untuk melihat apakah sebuah nilai indeks melebihi jumah elemen array atau tidak. Adalah memungkinkan bahwa nilai indeks bisa melebihi jumlah elemen di dalam array. Pada kelas vector, pengawalan dilakukan oleh fungsi at(). Dengan kode V.at(k), dimana k adalah nilai indeks, kode itu menghasilkan nilai elemen dari vektor V pada lokasi k. Jika nilai indeks melebihi jumlah elemen, maka fungsi at() akan memberikan peringatan dan menghentikan program, seperti diilustrasikan pada program berikut.

Program 13.5 Mengilustrasikan aplikasi dari fungsi at()

#include<iostream>
#include<vector>
using namespace std;

vector<int> V;

int main()
{
   V.assign(6,8); //menugaskan 6 nilai, masing-masing nilai 8, kepada V

   for (int i = 0; i< 6; i++)
      cout<<V[i] <<" ";
   cout<<"\n";

   for(int j=0;j< 6 ;j++)
   {
      V[j] = j*V[j]; //setiap elemen dikali dengan nilai indeksnya
      cout <<V[j]<<" ";
   }
   cout<<"\n";

   for (int k =0; k<8; k++)
   //Perhatikan bahwa nilai maks dari k lebih dari jumlah elemen
      cout<<"Elemen "<<k<<" = "<<V.at(k)<<endl;

   return 0;
}
KELUARAN
8 8 8 8 8 8
0 8 16 24 32 40
Elemen 0 = 0
Elemen 1 = 8
Elemen 2 = 16
Elemen 3 = 24
Elemen 4 = 32
Elemen 5 = 40

abnormal program termination


Pada program di atas, vektor V memiliki 6 elemen, masing-masing dengan nilai 8 dan ini ditampilkan pada baris pertama dari keluaran. Nilai-nilai tersebut kemudian dikalikan dengan nilai indeksnya masing-masing di dalam vektor, jadi nilai-nilai sekarang 0, 8, 16, 32, dan 40 seperti ditampilkan pada baris kedua dari keluaran. Nilai-nilai ini diprogram untuk ditampilkan dengan fungsi at(k), dimana k bervariasi dari 0 sampai 7, yaitu 2 lebih dari jumlah elemen. Program kemudian menampilkan 6 elemen pertama dan setelah itu program berhenti karena nilai indeks lebih dari jumlah elemen aktual di dalam vektor.

Program 13.6 Mengilustrasikan aplikasi dari fungsi erase() dan front()

#include<iostream>
#include<vector>
using namespace std;

vector<int> V2(2);   //V2 memiliki dua elemen, masing-masing nilai 0.
vector<double> V4;

int main()
{
   for (int i = 1; i<6; i++)
   {
      V2.push_back (i*i);  //5 nilai (1, 4, 9, 16, 25) ditempatkan ke dalam V2
      V4.push_back (i*2.5); //5 nilai ditempatkan ke dalam V4
   }
   cout<<"\nV4 = ";

   vector<double>:: iterator itr4;
   for(itr4 = V4.begin(); itr4 != V4.end(); itr4++)
      cout<< *itr4<<" "; //menampilkan elemen-elemen dari V4

   vector<int> :: iterator itr;
   cout<<"\nSekarang V2 = ";
   for(itr = V2.begin(); itr != V2.end(); itr++)
      cout<<*itr<<" " ;

   cout<<"\nSetelah menghapus dua elemen pertama, V2 = ";
   if ( V2.front() ==0)
      V2.erase(V2.begin(),V2.begin()+2);
   //menghapus elemen pertama dan kedua. Elemen ketiga tidak dihapus

   for(itr = V2.begin(); itr != V2.end(); itr++)
      cout<< *itr<<" "; //statemen keluaran

   V2.pop_back( );
   V2.pop_back();

   cout<<"\nSetelah dua kali pop-back, V2 = ";
   for( itr = V2.begin(); itr != V2.end(); itr++)
      cout<< *itr<<" ";
   cout<<endl;

   return 0;
}
KELUARAN
V4 = 2.5 5 7.5 10 12.5
Sekarang V2 = 0 0 1 4 9 16 25
Setelah menghapus dua elemen pertama, V2 = 1 4 9 16 25
Setelah dua kali pop-back, V2 = 1 4 9


Pada program berikut, sejumlah operasi dengan operator-operator relasional seperti ==, <, >, <=, >=, dan lainnya, diterapkan dengan cara yang sama seperti tipe-tipe fundamental.

Program 13.7 Mengilustrasikan kegunaan dari operator-operator relasional pada vektor

#include<iostream>
#include<vector>
using namespace std;

vector<int> V1;
vector<int> V2;
vector<int> V3;
vector<int> V4;

int main()
{
   V2.assign(5, 65); //menugaskan 5 elemen, masing-masing 65, kepada V2
   V3.assign(5, 70); //menugaskan 5 elemen, masing-masing 70, kepada V3
   V1.push_back(2);        //push_back menempatkan nilai 2 di belakang vektor V1
   V1.push_back(4);        //push_back menempatkan nilai 4 di belakang vektor V1

   V1.push_back(5);
   V1.push_back(6);
   V1.push_back(7);

   if (V2 == V1)     // uji ekualitas
      cout<< "Vektor V1 dan V2 sama"<<endl;
   else
      cout<<"Vektor V1 dan V2 tidak sama"<<endl;

   V2 = V1; //V1 ditugaskan kepada V2

   cout<<"Setelah penugasan: " << endl;
   if(V1!= V2)
      cout<<"Vektor V1 tidak sama dengan V2"<<endl;
   else
      cout<<"Vektor V1 dan V2 sama."<<endl;

   cout<<"Elemen-elemen dari V2 adalah berikut: "<<endl;
   for (int i = 0; i< 5; i++)
      cout<<" V2["<<i<<"] = "<<V2[i]<<endl;

   return 0;
}
KELUARAN
Vektor V1 dan V2 tidak sama
Setelah penugasan:
Vektor V1 dan V2 sama.
Elemen-elemen dari V2 adalah berikut:
 V2[0] = 2
 V2[1] = 4
 V2[2] = 5
 V2[3] = 6
 V2[4] = 7


FUNGSI insert()
Fungsi insert() mengambil tiga argumen, dimana argumen pertama merupakan lokasi di mana penyisipan diinginkan, argumen kedua merupakan jumlah penyisipan, dan argumen ketiga adalah nilai dari tiap penyisipan. Lihat program berikut untuk ilustrasi.

Program 13.8 Mengilustrasikan penyisipan pada lokasi-lokasi tertentu

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;

vector<int> V1;
vector<double> V2 ;
vector<char> V3;

void main()
{
   for (int i =0; i<=4;i++)
   {
      V1.push_back (i+2 ); //menciptakan sebuah vektor
      V2. push_back (sqrt(i+2));
      V3.push_back (65 + i);
   }

   vector<int>::iterator K1 = V1.begin();
   vector<double>::iterator K2 = V2.begin();
   vector<char>::iterator K3 = V3.begin();

   cout <<"Sebelum penyisipan: "<<endl;
   cout <<"V1\tV2\t V3"<<endl;
   while (K1 != V1.end())
   {
      cout <<*K1<<"\t"<<*K2<<"\t"<< *K3<<endl;
      K1++;
      K2++;
      K3++;
   }

   vector<int>::iterator A1 = V1.begin();
   vector<double>::iterator A2 = V2.begin();
   vector<char>::iterator A3 = V3.begin();

   V1.insert(A1 ,3,9);            //menyisipkan tiga buah nilai 9 di awal dari V1.
   V2.insert(A2+2,3,10.5); /*menyisipkan tiga elemen masing-masing bernilai
                             10.5 pada lokasi ke-3.*/

   V3.insert (A3+3,3,'A'); /*menyisipkan tiga elemen masing-masing bernilai
                           3 pada lokasi ke-4.*/

   cout<<"Setelah penyisipan: "<<endl;
   cout <<"V1\tV2\t V3"<<endl;
   while (A1 != V1.end())
   {
      cout<<*A1<<"\t"<<*A2<<"\t"<<*A3<< endl;
      A1++;
      A2++;
      A3++;
   }
}
KELUARAN
Sebelum penyisipan:
V1      V2       V3
2       1.41421  A
3       1.73205  B
4       2        C
5       2.23607  D
6       2.44949  E

Setelah penyisipan:
V1      V2       V3
9       1.41421  A
9       1.73205  B
9       10.5     C
2       10.5     A
3       10.5     A
4       2        A
5       2.23607  D
6       2.44949  E

Sebelum penyisipan V1 memiliki elemen-elemen 2, 3, 4, 5, dan 6. Vektor V2 memiliki elemen-elemen yang merupakan akar kuadrat dari elemen-elemen dari V1 dan vektor V3 memiliki elemen-elemen A, B, C, D, dan E. Dalam V1, tiga elemen, yang masing-masing bernilai 9, disisipkan di awal vektor tersebut. Dalam V2, tiga elemen, yang masing-masing bernilai 10.5, disisipkan di lokasi ketiga di dalam vektor tersebut. Sama halnya, tiga A disisipkan di posisi keempat di dalam vektor V4.



13.7 Fungsi-Fungsi dan Operator-Operator yang Didukung oleh Kelas list
Kelas list merupakan kelas kontainer sekuensial lain di dalam C++. Kelas list memiliki kemampuan penyisipan dan penghapusan cepat di mana saja di dalam sebuah list. Kelas ini mendukung iterator dwi-arah (bidirectional). Banyak fungsi anggota dari kelas list sama dengan yang ada dari kelas vector. Fungsi-fungsi yang sama untuk kelas vector dan kelas list dicantumkan pada Tabel 13.3.

TABEL 13.3 Fungsi-fungsi anggota dari kelas list sama dengan yang ada dari kelas vector.
assign()
back()
begin()
clear()
empty()
end()
erase()
front()
insert()
max_size()
pop_back()
push_back()
rbegin()
remove()
rend()
resize()
size()
swap()



TABEL 13.4 Fungsi-fungsi tambahan di dalam kelas list.
No
Fungsi
Penjelasan
1
merge()
Menggabungkan sebuah list dengan list lain.
2
pop_front()
Menghapus elemen pertama dari list.
3
push_front()
Menambahkan sebuah elemen di depan list.
4
remove()
Menghapus elemen-elemen dari list.
5
remove_if()
Menghapus elemen jika memenuhi predikat.
6
reverse()
Membalikkan list.
7
sort()
Mengurutkan list dengan tatanan menaik.
8
splice()
Fungsi ini menghapus elemen-elemen dari satu list ke list lain.
9
unique()
Fungsi ini menghapus elemen-elemen duplikat bertetangga. List diurutkan lebih dahulu untuk membuat elemen-elemen duplikat menjadi bertetangga.


Kode-kode aplikasi untuk fungsi-fungsi yang diberikan pada Tabel 13.3 sama dengan apa yang telah diberikan untuk kelas vector. Program-program berikut memberikan ilustrasi aplikasi dari fungsi-fungsi tambahan yang dicantumkan pada Tabel 13.4. Kelas list mendukung operator-operator relasional. Sebuah list dapat ditugaskan dengan operator = dan dibandingkan dengan list lain dengan operator >, <, >=, <=, dan lainnya. Program berikut mengiliustrasikan konstruksi list oleh sejumlah metode.

Program 13.9 Mengilustrasikan aplikasi dari fungsi assign(), push_back(), begin(), end(), dan operator = dan == untuk list

#include <iostream>
#include <list>
#include <string>
using namespace std;

list <int> L1, L2, L3 ; //mendeklarasikan tiga list bertipe int.
list <string> L4;          //mendeklarasikan list yang memuat string-string.

void main()
{
   for (int i=1; i<6;i++)
      L1.push_back(i*i );  //menempatkan nilai-nilai dengan push_back()

   L2.assign (5, 75);             //menempatkan nilai-nilai dengan assign()
   L3 = L1;                              //konstruktsi list dengan penugasan

   const int n =5;
   string Nama[n]={"Kristof", "Santi","Dwi", "Vivian", "Rosintan"};

   for(int j=0; j<5; j++)
      L4.push_back(Nama[j]);

   //menempatkan nilai-nilai dalam bentuk string-string
   cout<<"List awal adalah sebagai berikut: "<<endl;
   cout<< "L1 = " ;
   list<int>::iterator itr ; //deklarasi dari iterator
   for(itr = L1.begin(); itr !=L1.end(); itr ++)
      cout<< *itr <<" ";
   cout<<"\n";

   cout<<"L2 = ";
   for(itr = L2.begin(); itr !=L2.end(); itr ++)
      cout<<*itr <<" ";

   L3 = L2;
   cout<<"\n";
   cout<<"L3 = ";
   for(itr = L3.begin(); itr !=L3.end(); itr ++)
      cout<<*itr<<" ";
   cout<<"\nL4 = ";

   list<string>::iterator iter ;
   for(iter = L4.begin(); iter !=L4.end(); iter ++)
      cout<< *iter <<" ";

   L3 = L1 ;         //L1 disalin ke L3
   cout<<"\nL3 baru = ";
   for(itr = L3.begin(); itr !=L3.end(); itr ++)
      cout<<*itr<<" ";

   if ( L1 == L3)    //perbandingan atas dua string
      cout<<"\nL1 dan L3 sama"<<endl;
   else
      cout<<"\nL1 dan L3 tidak sama\n";
}
KELUARAN
List awal adalah sebagai berikut:
L1 = 1 4 9 16 25
L2 = 75 75 75 75 75
L3 = 75 75 75 75 75
L4 = Kristof Santi Dwi Vivian Rosintan
L3 baru = 1 4 9 16 25
L1 dan L3 sama



13.8 Aplikasi dari Beberapa Fungsi dari Kelas list
FUNGSI unique(), reverse(), dan remove()
Fungsi unique() menghapus elemen-elemen duplikat dari list. Fungsi reverse() membalikkan urutan elemen-elemen di dalam list, jadi elemen pertama menjadi elemen terakhir dengan perubahan-perubahan urutan yang sama pada elemen-elemen lain. Lihat program berikut untuk ilustrasi.


Program 13.10 Mengilustrasikan aplikasi dari fungsi unique(), reverse(), dan remove()

#include<iostream>
#include<list>
using namespace std;

list<char> L1;

void main()
{
   for (int i=0; i<6;i++)
   {
      L1.push_back(73 - i);
      L1.push_back(73 - i);
   }

   cout <<"List awal adalah sebagai berikut: "<<endl;
   list<char>::iterator T1;
   for ( T1 = L1.begin() ; T1!=L1.end() ; T1++ )
      cout <<" " <<*T1 ;
   cout <<endl;

   L1.unique();            //menghapus salinan-salinan duplikat
   cout <<"Setelah penghapusan salinan duplikat, list menjadi: "<<endl;
   for ( T1 = L1.begin() ; T1!=L1.end() ; T1++ )
      cout <<" " <<*T1 ;

   L1.reverse();
   cout<<"\nSetelah pembalikan urutan, list menjadi: \n";
   for (T1 = L1.begin() ; T1!=L1.end() ; T1++ )
      cout <<" " <<*T1 ;

   cout<<"\nSetelah penghapusan F, list menjadi: \n";
   L1.remove ('F');
   for (T1 = L1.begin() ; T1!=L1.end() ; T1++ )
      cout <<" " <<*T1 ;
   cout <<endl;
}
KELUARAN
List awal adalah sebagai berikut:
 I I H H G G F F E E D D
Setelah penghapusan salinan duplikat, list menjadi:
 I H G F E D
Setelah pembalikan urutan, list menjadi:
 D E F G H I
Setelah penghapusan F, list menjadi:
 D E G H I

Keluaran dari program tersebut cukup mudah dipahami. Baris kedua dari keluaran merupakan list awal yang memiliki beberapa elemen duplikat. Dengan fungsi unique(), elemen-elemen duplikat dihapus dan list hasil hanya memuat empat nilai unik (baris keempat dari keluaran). Urutan elemen-elemen list kemudian dibalik. Pada list terbalik, huruf F dihapus dengan fungsi remove(). Baris terakhir dari keluaran menunjukkannya.

Program 13.11 Mengilustrasikan aplikasi dari fungsi begin(), swap(), end(), dan sort() pada list

#include<iostream>
#include<list>
using namespace std;

list<char> L1;
list<int> L2;
list<int> L3;

void main()
{
   int A[] = {78, 58, 90, 44, 33, 11};

   for (int i=0; i<6;i++)
   {
      L1.push_back(75 - i);
      L2.push_back (A[i]);
      L3. push_back(i*i);
   }

   cout<<"List awal adalah sebagai berikut: "<<endl;
   list<char>::iterator T1;
   list <int>::iterator T2;

   cout<<"List L1 = ";
   for (T1 = L1.begin() ; T1!=L1.end() ; T1++ )
      cout <<" " <<*T1<<" " ;

   cout<<"\nList L2 = ";
   for (T2 = L2.begin() ; T2!=L2.end() ; T2++ )
      cout <<" " <<*T2<<" " ;

   cout<<"\nList L3 = ";
   for (T2 = L3.begin() ; T2!=L3.end() ; T2++ )
      cout <<" " <<*T2<<" " ;

   L3.sort();
   L2.sort();
  
   L2.swap(L3); //menukar elemen-elemen dari dua list
   cout<<"\nList terurut dan tertukar adalah sebagai berikut: "<<endl;
   cout<<"\nList L2 =" ;
   for (T2 = L2.begin() ; T2!= L2.end() ; T2++)
      cout <<" "<<*T2<<" " ;

   cout<<"\nList L3 =" ;
   for (T2 = L3.begin() ; T2!= L3.end() ; T2++)
      cout <<" "<<*T2<<" " ;
}
KELUARAN
List awal adalah sebagai berikut:
List L1 =  K  J  I  H  G  F
List L2 =  78  58  90  44  33  11
List L3 =  0  1  4  9  16  25
List terurut dan tertukar adalah sebagai berikut:

List L2 = 0  1  4  9  16  25
List L3 = 11  33  44  58  78  90


Pada program tersebut, list L2 dan L3 ditukar dan diurutkan. Hal ini terlihat pada keluaran program.

Program berikut mendeklarasikan sebuah list dengan elemen-elemen bertipe char dan dengan nama L1 dan dengan nama L2 yang bertipe int. List L1 dikonstruksi dengan fungsi push_back(). List L2 ditugasi 5 elemen, dengan tiap elemen bernilai 50, dengan fungsi assign(). Fungsi L1.front() dan L1.back() menghasilkan referensi ke elemen pertama dan ke elemen terakhir dari list L1. Kedua list ditampilkan dengan bantuan iterator.

Program 13.12 Mengilustrasikan aplikasi dari fungsi front(), back(), begin(), dan end() pada list

#include<iostream>
#include<list>
using namespace std;

list<char> L1 ;
list<int> L2;

int main()
{
   for (int i=0; i<5;i++)
   {
      L1.push_back(65+i);
      L2.assign( 5, 50 );
   }

   list<char> ::iterator T1= L1.begin();

   cout<<"List L1 adalah:"<<endl;
   while (T1 !=L1.end())
   {
      cout <<" "<<*T1 <<" ";
      T1++;
   }
   cout<<"\n";

   list <int> :: iterator T2 = L2.begin();

   cout<<"List L2 adalah: "<<endl;
   while (T2 !=L2.end())
   {
      cout<<" "<<*T2<<" ";
      T2++;
   }
   cout<<"\n";

   cout<<"Elemen pertama dari L1 adalah: "<<L1.front()<<endl;
   cout<<"Elemen terakhir dari L1 adalah: "<<L1.back()<<endl;

   return 0;
}
KELUARAN
List L1 adalah:
 A  B  C  D  E
List L2 adalah:
 50  50  50  50  50
Elemen pertama dari L1 adalah: A
Elemen terakhir dari L1 adalah: E



FUNGSI merge()
Jika list L2 perlu disambung dengan list L1, kode yang diperlukan dituliskan berikut:

L1.merge(L2);

Setelah eksekusi program, list L2 menjadi kosong. Ini diilustrasikan pada program berikut.

Program 13.13 Mengilustrasikan aplikasi dari fungsi front(), back(), begin(), dan end() pada list

#include<iostream>
#include<list>
using namespace std;

list<int> L1,L2;

void main()
{
   for (int i=1; i<5;i++)
   {
      L1.push_back(i);
      L2.push_back(i*i);
   }

   cout<<"List-list diberikan sebagai berikut: "<<endl;
   cout<<"List1\t List2 "<<endl;
   list<int>::iterator T1;
   list<int>::iterator T2;
   for(T1=L1.begin(),T2=L2.begin(); T1 != L1.end() ;T1++,T2++ )
      cout<<" "<<*T1 <<" \t "<< *T2 <<endl;

   L1.merge(L2); //menyambung L2 dengan L1
   cout<<"Lis list1 yang baru:"<< endl;
   for (T1=L1.begin() ; T1 != L1.end(); T1++ )
      cout<<" " <<*T1 <<" " ;

   if (L2.empty())
      cout<<"\nL2 sekarang kosong."<<endl;
}
KELUARAN
List-list diberikan sebagai berikut:
 List1   List2
 1       1
 2       4
 3       9
 4       16
Lis list1 yang baru:
 1  1  2  3  4  4  9  16
L2 sekarang kosong.



13.9 Fungsi-Fungsi dan Operator-Operator yang Didukung oleh Kelas deque
Sejumlah fungsi yang umum digunakan yang didukung oleh kelas deque dicantumkan pada Tabel 13.5. Fungsi-fungsi lain yang didukung oleh kelas deque, yang juga didukung oleh kelas vector adalah fungsi push_front() dan pop_front(). Fungsi capacity() dan reserve() bukan fungsi anggota dari kelas deque.

TABEL 13.4 Fungsi-fungsi anggota yang didukung oleh kelas deque.
assign()
back()
begin()
clear()
at()
empty()
end()
erase()
front()
insert()
pop_front()
max_size()
pop_back()
push_back()
push_front()
rbegin()
rend()
resize()
size()
swap()

Kelas deque mendukung operator-operator relasional. Sebuah deque dapat ditugaskan dengan operator = dan dibandingkan dengan deque lain dengan operator >, <, >=, <=, dan lainnya.

Program 13.14 Mengilustrasikan iterator, push_back(), push_front() pada deque

#include<iostream>
#include<deque>
using namespace std;
deque<int> Q1, Q3;
deque<char> Q2;

int main()
{
   for (int i =0; i<4;i++)
   {
      Q1.push_back (i*i);
      Q2.push_back (65 +i);
   }

   Q3 = Q1; //Q1 ditugaskan kepada Q3

   Q3.push_front(20);
   Q3.push_back(20*20);

   for (int j = 0; j<4; j++)
      cout <<Q1[j]<<"\t"<<Q2[j] <<endl;

   cout<<"\nUkuran dari Q3 = "<<Q3.size()<<endl;
   cout <<"Elemen-elemen dari Q3 adalah: ";

   deque<int>:: iterator iter;

   for (iter = Q3.begin(); iter < Q3.end(); iter++)
      cout<< *iter <<" ";

   return 0;
}
KELUARAN
0       A
1       B
4       C
9       D

Ukuran dari Q3 = 6
Elemen-elemen dari Q3 adalah: 20 0 1 4 9 400



13.10 Aplikasi dari Fungsi-Fungsi yang Didukung oleh Kelas deque

Program 13.15 Mengilustrasikan iterator, push_back(), pop_front(), pop_back, dan size() untuk deque

#include<iostream>
#include <deque>
using namespace std;

int main()
{
   deque <double> Q1;

   for (int i =0; i< 7;i++)
      Q1.push_back (1.5*i);

   cout<<"Elemen-elemen queue adalah: "<<endl;
   for (int j = 0; j<6; j++)
      cout <<" "<< Q1[j]<<" " ;
   cout<<endl;

   cout <<"Ukuran dari Q1 adalah: " <<Q1.size()<<endl;
 
   Q1.pop_back();
   Q1.pop_front();

   cout<<"Sekarang ukuran dari Q1 adalah: "<<Q1.size()<<endl;
  
   deque <double> :: iterator itr; // itr adalah nama dari iterator
   Q1.insert((Q1.begin() +2),2,50.5); ;
   //menyisipkan 2 elemen dengan nilai 50.5.

   cout<<"Elemen-elemen dari Q1 adalah: "<<endl;
   for (itr = Q1.begin(); itr < Q1.end() ; itr ++)
      cout<<*itr <<" " ;
   cout<<endl;

   return 0;
}
KELUARAN
Elemen-elemen queue adalah:
 0  1.5  3  4.5  6  7.5
Ukuran dari Q1 adalah: 7
Sekarang ukuran dari Q1 adalah: 5
Elemen-elemen dari Q1 adalah:
1.5 3 50.5 50.5 4.5 6 7.5


Karena deque adalah antrian dengan dua ujung (double ended queue), elemen-elemen dapat ditambahkan di ujung depan maupun di ujung belakang dari antrian. Program berikut mengilustrasikannya.

Program 13.16 Mengilustrasikan aplikasi dari fungsi erase(), push_front(), push_back(), dan insert()

#include<iostream>
#include <deque>
using namespace std;

int main()
{
   deque <int> Q1;
   Q1.assign(4, 12) ;

   cout<<"Elemen-elemen dari antrian adalah: "<<endl;
   for (int j = 0; j<4; j++)
      cout <<" "<< Q1[j]<<" " ;
   cout<<endl;

   cout<<"Ukuran dari Q1 adalah: " << Q1.size()<<endl;

   cout<<"Menempatkan dua (nilai 10) di depan dan dua (nilai 20) di akhir antrian."<<endl;
   Q1.push_front(10 );
   Q1.push_front(10 );
   Q1.push_back(20);
   Q1.push_back(20);

   deque<int> :: iterator itr ;
   // itr adalah nama iterator
   for (itr= Q1.begin(); itr != Q1.end(); itr++)
      cout << *(itr ) <<" " ;

   cout <<"\nElemen-elemen ke-2 sampai ke-4 dihapus."<<endl;
   Q1.erase((Q1.begin() +1),(Q1.begin() +4 ) );

   cout<<"Menyisipkan dua nilai 50 pada posisi ke-3."<<endl;
   Q1.insert((Q1.begin() +2),2,50 );

   cout<<"Sekarang ukuran dari Q1 adalah: "<<Q1.size()<<endl;

   cout<<"Elemen-elemen dari Q1 adalah: "<<endl;
   for (itr = Q1.begin() ; itr < Q1.end () ; itr ++)
      cout<<*itr <<" " ;
   cout<<endl;

   return 0;
}
KELUARAN
Elemen-elemen dari antrian adalah:
 12  12  12  12
Ukuran dari Q1 adalah: 4
Menempatkan dua (nilai 10) di depan dan dua (nilai 20) di akhir antrian.
10 10 12 12 12 12 20 20
Elemen-elemen ke-2 sampai ke-4 dihapus.
Menyisipkan dua nilai 50 pada posisi ke-3.
Sekarang ukuran dari Q1 adalah: 7
Elemen-elemen dari Q1 adalah:
10 12 50 50 12 20 20



LATIHAN
1.       Apakah itu kontainer runtun?
2.       Apakah kesamaan dan perbedaan antara vektor dan list?
3.       Sebuah vektor harus memiliki 5 elemen. Setiap elemen memiliki nilai 35. Bagaimana Anda mengkonstruksi vektor itu?
4.       Sebuah list harus memiliki 5 nama sebagai elemen-elemennya. Bagaimana Anda mendeklarasikan dan menginisialisasi list?
5.       Apa perbedaan utama antara list dan deque?
6.       Apa perbedaan antara fungsi capacity() dan fungsi size()?
7.       Apakah argumen-argumen dari fungsi erase() dari kelas vector?
8.       Fungsi-fungsi apakah yang didukung oleh list tetapi tidak didukung oleh vektor?
9.       Apa itu iterator?
10.    Bagaimana Anda mendeklarasikan sebuah iterator untuk vektor dengan elemen-elemen int?
11.    Apa yang Anda pahami tentang fungsi begin() dan end()?
12.    Apa perbedaan antara fungsi back() dan end()?
13.    Apa perbedaan antara fungsi begin() dan rbegin()?
14.    Apa perbedaan antara fungsi begin() dan front() ketika diterapkan pada list?
15.    Berikan contoh kode untuk mengilustrasikan fungsi remove() dan remove_if().
16.    Apa yang Anda pahami tentang fungsi max_size() ketika diterapkan pada deque?
17.    Tulislah sebuah program untuk mengilustrasikan fungsi sort() untuk mengurutkan sebuah list dengan 10 karakter yang dimasukkan oleh user.
18.    Tulislah sebuah program untuk deque yang mengilustrasikan fungsi size(), resize(), dan insert().
19.    Tulislah sebuah program untuk vektor yang mengilustrasikan sejumlah konstruktor.
20.    Tulislah sebuah program dimana di dalamnya dua vektor yang berukuran sama dikonstruksi dan ditukar dan ditampilkan pada layar.
21.    Tulislah sebuah program untuk list yang mengilustrasikan aplikasi dari fungsi insert().
22.    Buatlah sebuah list dengan karakter-karakter dengan tatanan menurun dari Z sampai A dan urutkan dengan tatanan menaik dari A sampai Z dan tampilkan isinya.

Jawaban:

Program 13.17 Mengurutkan list yang memuat karakter A sampai Z

#include<iostream>
#include<list>
using namespace std;

list <char> L1; // declaration of list

void main()
{
   for (int i=0; i<26;i++)
      L1.push_back(90 - i ); //konstruksi list

   list<char>::iterator T;

   cout<<"List awal adalah: "<<endl;
   for (T = L1.begin(); T!=L1.end(); T++)
      cout <<" " <<*T ; //statemen keluaran
   cout<<"\n\n";

   L1.sort() ; //untuk mengurutkan
  
   {
      list<char> ::iterator IT;
      cout<<"List terurut adalah: "<<endl;
      for ( IT = L1.begin(); IT!=L1.end(); IT++)
         cout<<" " <<*IT ; //statemen keluaran setelah pengurutan
   }
   cout<<endl;
}
KELUARAN
List awal adalah:
 Z Y X W V U T S R Q P O N M L K J I H G F E D C B A

List terurut adalah:
 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

23.    Tulislah sebuah program yang mengilustrasikan aplikasi dari fungsi at() dan yang menampilkan bahwa fungsi itu lebih baik daripada dengan menggunakan operator indeks [].