Anda di halaman 1dari 56

Vector

Theresia Herlina Rochadiani, S.Kom., M.T.

Standard Library
• ​Standard C++ library ​terdiri dari:
• ​C Library
• ​Standard Template Library (STL)
• ​Container library
• ​Iterator library
• ​Algorithm library
• ​C++ Miscellaneous Library
• ​Language support library (new, typeinfo, limits)
• ​Diagnostic library (exceptions)
• ​General utility library
• ​String library
Mereferensi C Library
• ​Library standar C sebagian besar tersedia di
C++ ​• ​dgn sedikit perubahan nama library:
• ​<math.h> ​menjadi <
​ cmath>
• ​fungsi spt ​sqrt()​, ​abs()
• ​<stdlib.h> ​menjadi ​<cstdlib>
• ​fungsi spt ​rand()​, ​srand()
Motivasi Template
• ​Fungsi maximum dua data:
int maximum(const ​int​& left, const ​int​& right)
{
return (left > right) ? left : right;
}
• ​hanya bekerja dengan baik untuk ​int​, namun ​tidak ​dapat digunakan
untuk tipe data lain
• ​maximum unt ​double​? untuk ​char​?

Motivasi Template
• ​Class untuk sepasang data bertipe sama:
class Pair {
private:
int ​_first;
int ​_second;
public:
Pair(​int ​a, ​int ​b) : _first(a), _second(b) {}
int ​getFirst() const { return _first; }
int ​getSecond() const { return _second; }
};
• ​hanya bekerja pada sepasang ​int
• ​bisa untuk koordinat 2D, mis (​5,​ ​7)​
• ​tidak bisa untuk sepasang ​string​, mis (​"Potter"​, ​"Harry"​) ​•
tidak bisa untuk sepasang ​double​, mis (​1.23​, -​3.45​)

Template
• ​Bisakah kita menulis fungsi atau class yang dapat menerima
tipe ​data apapun, namun hanya ditulis sekali?
• ​ya, dengan template

• ​Template adalah fungsi atau class yang ditulis untuk tipe yang
belum dispesifikasi
• ​STL (Standard Template Library) penuh berisi solusi template
berbagai ​struktur data dan algoritma

Template Fungsi Maximum


keyword unt implementasi template
parameter tipe data ​T
template <typename T>
T ​maximum(const ​T​& left, const ​T​& right)
{
return (left > right) ? left : right;
}

• ​parameter tipe data T akan disubstitusi dengan tipe data


sesungguhnya
Pemakaian Template Fungsi Maximum
• ​Unt memakai template fungsi, spesifikasikan tipe data secara eksplisit:
char ​maxChar = maximum<​char​>('a', '!');
int ​maxInt = maximum<​int​>(5, -7);
double ​maxDouble = maximum<​double​>(3.1415, 0.1);

double ​maximum(const ​double​& left, const ​double​& right)


{
return (left > right) ? left : right;
}
• ​Compiler otomatis membuat code sesungguhnya dgn
substitusi parameter tipe T dengan tipe yang dispesifikasi

Pemakaian Template Fungsi Maximum


• ​Unt memakai template fungsi, spesifikasikan tipe data secara eksplisit:
char maxChar = maximum<char>('a', '!');
int maxInt = maximum<int>(5, -7);
double maxDouble = maximum<​double​>(3.1415, 0.1);

double ​maximum(const ​double​& left, const ​double​& right)


{
return (left > right) ? left : right;
}

• ​Compiler otomatis membuat code sesungguhnya dgn


substitusi parameter tipe T dengan tipe yang dispesifikasi

Template class Pair


• ​Untuk membuat template class:
• ​Gunakan parameter tipe data, misal ​T
• ​Gunakan ​T ​sebagai tipe data di dalam class
template <typename T>
class Pair {
private:
T ​_first;
T ​_second;
public:
​ , ​T ​b) : _first(a), _second(b) {}
Pair(​T a
T ​getFirst() const { return _first; }
T ​getSecond() const { return _second; }
};

Pemakaian Template class Pair


• ​Untuk template class, deklarasi nama tipe harus
eksplisit ​Pair<int> intPair(5, 7);
Pair<string> nama("Potter", "Harry");
Pair<double> koordinat(1.23, -3.45);

Multiple Typename
• ​Class ​Pair ​dpt dibuat unt dua elemen berbeda
tipe: ​• ​("Harry
Potter", 18)
• ​(10, "sepuluh")

template <typename T1, typename T2>


class Pair {
private:
T1 ​_first;
T2 ​_second;
public:
Pair(​T1 ​a, ​T2 ​b) : _first(a), _second(b) {}
T1 ​getFirst() const { return _first; }
T2 ​getSecond() const { return _second; }
};

Standard Template Library (STL)


• ​Impian para programmer!
• ​Tiga komponen STL yang akan kita pelajari:
• ​Iterator, ​beri akses ke elemen dalam container
• ​Container, ​mengorganisasi elemen
• ​Algorithm, ​memanipulasi elemen dalam container
• ​Komponen tsb didefinisikan sebagai template class atau template
function

Algorithm Iterator
Container ​
STL Iterator
• ​Sebuah iterator menyerupai sebuah pointer
• ​Menggunakan iterator, sebuah algoritma dapat mengakses dan
memanipulasi elemen dalam container tanpa harus peduli
bagaimana elemen tersebut diorganisasi dalam container
Pointer
• ​Apa yang dapat dilakukan pointer?
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int *p;
for (p = a; p != a+9; ++p) {
cout << *p << endl;
}
1. diinisialisasi menunjuk ke awal container (array pada contoh di atas) 2.
dibandingkan dengan pointer lain untuk cek apakah sudah menunjuk pada akhir
container
3. di-increment (​++​) untuk menunjuk ke elemen berikutnya dalam container
4. di-deference (​*)​ untuk mengakses elemen dalam container

Operasi pada Iterator


• ​Demikian pula pada iterator ​iter ​pada suatu container
1. *iter ​: akses (dereferensi) item yg ditunjuk iterator
2. iter++ ++iter ​: menggeser iterator menunjuk ke item
selanjutnya dalam container
3. iter-- --iter ​: menggeser iterator menunjuk ke item
sebelumnya dalam container
4. iter1 == iter2 ​: return ​true ​jika kedua iterator menunjuk
ke ​item yang sama dalam container
5. iter1 != iter2 ​: return ​true ​jika kedua iterator
tidak ​menunjuk ke item yang sama dalam
container
Iterator sebuah Container
• ​Semua class container menyediakan iterator mereka
masing​2​ ​dengan nama sama: i​ terator
• ​deklarasi:
• ​container::iterator variabelIterator
• ​contoh:
• ​vector<int>::iterator myIter;
Iterator sebuah Container
• ​Semua class container menyediakan iterator mereka masing

masing dengan nama sama: i​ terator​ ​• ​deklarasi:


• ​container::iterator variabelIterator
• ​contoh:
• ​vector<int>::iterator myIter;
• ​Semua class container mendefinisikan fungsi:
• ​begin() ​: return sebuah iterator yang menunjuk pada ​awal ​container
• ​end() ​: return sebuah iterator yang menunjuk pada ​satu elemen
setelah akhir container​, biasa digunakan sebagai kondisi berhenti pada
loop

STL Container
• ​STL container:
• ​implementasi dari beberapa ​struktur data ​yang
berguna ​• ​obyek yang berisi obyek lain

• ​Fitur container:
• ​container adalah sebuah template class
• ​container mendukung beberapa fungsi:
• ​size() ​: banyaknya elemen
• ​empty() ​: apakah container kosong?
• ​begin()
• ​end()

Vector
• ​Container yang sangat sederhana
• ​Array yang diperbaiki/diperkuat
• ​Dapat digunakan seperti array
• ​Akses nilai dengan index, misal ​v ​sebuah
vector: ​• ​x = v[i];
• ​v[j] = z;
• ​Kemampuan tambahan :
• ​menambah/mengurangi panjang vector
• ​mengisi elemen pada posisi tertentu
• ​menghapus elemen dari posisi tertentu
Pembuatan / Penambahan Vector
vector<string> strawHat;
vector untuk simpan string, kosong

strawHat
Pembuatan / Penambahan Vector
strawHat.push_back("Sanji
vector<string>
?
") ​[2]​
strawHat; ​ enambah elemen strawHat[5] = "Chopper​";
m

ke vector vector unt simpan string, kosong

strawHat.push_back("Luffy
"); strawHat[0]
strawHat.push_back("Zoro" strawHat[1]
); strawHat[2]
strawHat.push_back("Nami"
strawHat[3]
);
strawHat.push_back("Usopp strawHat[4]
");
[0]
"Zoro" "Usopp" "Sanji"
"Luffy" "Nami" [4]
strawHat [1] [3]

Pembuatan / Penambahan Vector


strawHat.push_back("Zoro"
vector<string> );
strawHat.push_back("Nami"
strawHat; ​menambah elemen );
strawHat.push_back("Usopp
ke vector
");
strawHat.push_back("Luffy strawHat.push_back("Sanji
"); ")
vector unt simpan string, kosong strawHat[2]
strawHat[3]

strawHat[0] strawHat[4]

strawHat[1]
strawHat[5] = error!
"Chopper​";
[0] [1] [2] [3] [4]

strawHat "Luffy" "Zoro" "Nami" "Usopp" "Sanji"

Pengisian Vector
[0] ​[1] [2] [3] [4]
"Usopp" "Sanji"
strawHat
"Luffy" "Zoro" "Nami"

strawHat.insert(2, "Chopper");

strawHat ​
?
Pengisian Vector
[0] ​[1] [2] [3] [4]
"Usopp" "Sanji"
strawHat
"Luffy" "Zoro" "Nami"

strawHat.insert(2, "Chopper");

[0] ​[1] [2] [3] [4]


[5]

strawHat
"Luffy" "Zoro" ​"Chopper"
"Nami" "Usopp"
"Sanji"

Penghapusan Vector ​[0] [1] [2]


[3] [4]

strawHat "Usopp" "Sanji"


"Luffy" "Zoro" "Nami"

strawHat.erase(1);
strawHat ​
?

Penghapusan Vector ​[0] [1] [2]


[3] [4]

strawHat "Usopp" "Sanji"


"Luffy" "Zoro" "Nami"
strawHat.erase(1);

[0] ​[1] [2] [3]


"Nami" "Usopp"
strawHat ​
"Luffy" "Sanji"
geser [2] [3] [4] ke [1] [2] [3]

Edit Elemen Vector


[0] ​[1] [2] [3] [4]
"Usopp" "Sanji"
strawHat
"Luffy" "Zoro" "Nami"

strawHat[3] = "Franky";

strawHat ​
?
Edit Elemen Vector
[0] ​[1] [2] [3] [4]

strawHat
"Luffy" "Zoro" "Nami" [0] ​[1] [2] [3]
"Usopp" "Sanji"

[4]

strawHat[3] =
"Franky";
strawHat ​"Luffy"
"Zoro" "Nami"
"Franky" ​"Sanji"

Fungsi Iterator STL Vector


• ​Fungsi pada vector terkait iterator:
• ​begin() ​: return iterator ke elemen pertama
• ​end() ​: return iterator ke akhir container
• ​erase(iter) ​: menghapus elemen yg ditunjuk ​iter
• ​insert(iter, e) ​: mengisi elemen ​e ​sebelum
elemen yang ditunjuk ​iter
• ​insert(iter, n, e) ​: mengisi elemen ​e ​sebelum
elemen yang ditunjuk ​iter ​sebanyak ​n
kali

Contoh Program
dgn STL Vector ?
using namespace std;
#include <iostream> int main() {
#include <vector> vector<int> intV;
cout << "intV size = " <<
intV.size() ​<< endl; for (int i =
Output: 0; i != 5; ++i)
intV.push_back(i);
cout << "intV size = " <<
dgn STL Vector
intV.size() << endl; if #include <iostream>
(!​intV.empty()​) { #include <vector>
cout << "intV = [ "; using namespace std;
for (int j = 0; j != intV.size(); int main() {
++j) cout << ​intV[j] ​<< " "; vector<int> intV;
cout << "]" << endl; cout << "intV size = " <<
} intV.size() ​<< endl; for (int i =
intV.​pop_back()​; 0; i != 5; ++i)
cout << "intV size = " << intV.push_back(i);
intV.size() << endl; cout << "intV size = " <<
system("pause"); intV.size() << endl; if
return 0; (!​intV.empty()​) {
} cout << "intV = [ ";
intV size = 0 for (int j = 0; j != intV.size();
intV size = 5 ++j)
intV = [ 0 1 2 3 4 ] intV size cout << ​intV[j] ​<< " ";
= 4
cout << "]" << endl;
Contoh Program }
intV.​pop_back()​; intV size = 0
cout << "intV size = " << intV size = 5
intV.size() << endl; intV = [ 0 1 2 3 4 ] intV size
= 4
system("pause");
return 0;
}

Output:
Iterator unt Traversal Vector
#include <iostream>
#include <vector>
using namespace std;
void printVector(vector<int>& iV) {
vector<int>::iterator ​iter;
cout << "V = [ ";
for (iter ​= ​iV.​begin()​; iter ​!= ​iV.​end()​;
++​iter) cout << ​*​iter << " ";
cout << "]" << endl;
}
int main() { system("pause");
vector<int> intV; return 0;
for (int i = 0; i != 5; ++i) }
intV.push_back(i); Output:
printVector(intV);
Iterator unt Traversal Vector
#include <iostream>
#include <vector>
using namespace std;
void printVector(vector<int>& iV) {
vector<int>::iterator ​iter;
cout << "V = [ ";
for (iter ​= ​iV.​begin()​; iter ​!= ​iV.​end()​;
++​iter) cout << ​*​iter << " ";
cout << "]" << endl;
}
int main() { return 0;
vector<int> intV; }
for (int i = 0; i != 5; ++i) Output:
intV.push_back(i); V = [ 0 1 2 3 4 ]
printVector(intV);
system("pause");
Iterator unt insert() dan erase() (1)
#include <iostream>
#include <vector>
using namespace std;
void printVector(vector<int>& iV) {
vector<int>::iterator iter;
cout << "V = [ ";
for (iter = iV.begin(); iter != iV.end();
++iter) ​cout << *iter << " ";
cout << "]" << endl;
}
int main() {
vector<int> intV;
for (int i = 0; i != 5; intV.push_back(i);
++i) printVector(intV);
Output:
V = [ 0 1 2 3 4 ]
Iterator unt insert() dan erase() (2)

V = [ -1 0 1 2 3 4 ] ​?
vector<int>::iterator myIter = intV.begin();
Output:
intV.​insert​(myIter, -1);
printVector(intV);
myIter++;
intV.​erase​(myIter);
print_vector(intV);
cout << *myIter << endl;
system("pause");
return 0;
}
Iterator untuk insert() dan erase() (2)

vector<int>::iterator myIter =

intV.begin();
intV.​insert​(myIter,
Output:
-1);
V = [ -1 0 1 2 3 4 ]
printVector(intV);
myIter++;
intV.​erase​(myIter);
print_vector(intV);
cout << *myIter <<
endl; system("pause");
return 0;
}

Iterator unt insert() dan erase() (2)

vector<int>::iterator myIter =
intV.begin();

intV.​insert​(myIter, -1);
Output:
printVector(intV);
V = [ -1 0 1 2 3 4 ]
myIter++;
intV.​erase​(myIter);
tV);
Output: ?
printVector(in
cout << *myIter <<
endl; system("pause");
return 0;
}
V = [ -1 1 2 3 4 ] 1
Iterator untuk insert() dan erase() (2)

vector<int>::iterator myIter =

intV.begin();

intV.​insert​(myIter, -1);
printVector(intV);
myIter++;
intV.​erase​(myIter);
printVector(intV);
?
cout << *myIter << endl;
system("pause");
return 0;
} V = [ -1 0 1 2 3 4 ]

Output:
V = [ -1 1 2 3 4 ] ​1

Output:

Iterator untuk insert() dan erase()

(2)​vector<int>::iterator myIter =

intV.begin();
intV.​insert​(myIter, V = [ -1 0 1 2 3 4 ]
-1);
printVector(intV);
Output:
myIter++; V = [ -1 1 2 3 4 ] 1
intV.​erase​(myIter);
myIter ​menunjuk ke ​elemen
printVector(intV);
sesudahnya pada posisi yg
cout << *myIter << sama
endl; system("pause");
return 0;
}

Output:
#include <iostream>
#include <vector>

int ​main () {
vector<​int​> myvector (3,100);
vector<​int​>::iterator it;
it = myvector.begin();
it = myvector.insert ( it , 200 );
myvector.insert (it,2,300);
it = myvector.begin();

vector<​int​> anothervector(2,400);
myvector.insert(it+2,anothervector.begin(),anothervector.end());
int ​myarray [] = { 501,502,503 };
myvector.insert (myvector.begin(), myarray, myarray+3);
cout << ​"myvector contains:"​;
for ​(it=myvector.begin();
it<myvector.end(); it++) cout << ​'
' ​<< *it;
cout << ​'\n’​;
?
Output:​ ​

return ​0;
}

#include <iostream>
#include <vector>
int ​main () {
vector<​int​> myvector (3,100);
vector<​int​>::iterator it;
it = myvector.begin();
it = myvector.insert ( it , 200 );
myvector.insert (it,2,300);
it = myvector.begin();

vector<​int​> anothervector(2,400);
myvector.insert(it+2,anothervector.begin(),anothervector.end());
int ​myarray [] = { 501,502,503 };
myvector.insert (myvector.begin(), myarray, myarray+3);
cout << ​"myvector contains:"​;
for ​(it=myvector.begin(); it<myvector.end(); it++)
cout << ​' ' ​<< *it;
cout << ​'\n’​;
return ​0;
}

Output:
100 100

myvector contains: 501 502 503 300 300 400 400 200 100
#include <iostream>
#include <vector>
int ​main () {
vector<​int​> myvector;
for ​(​int ​i=1; i<=10; i++)
myvector.push_back(i);
myvector.erase (myvector.begin()+5);
myvector.erase (myvector.begin(),myvector.begin()+3);
cout << ​"myvector contains:"​; return ​0;
for ​(​int ​i=0;
i<myvector.size(); ++i) cout
<< ​' ' ​<< myvector[i]; }

cout << ​'\n’​;


Output:​ ​?
#include <iostream>
#include <vector>
int ​main () {
vector<​int​> myvector;
for ​(​int ​i=1; i<=10; i++)
myvector.push_back(i);
myvector.erase (myvector.begin()+5);
myvector.erase (myvector.begin(),myvector.begin()+3);
cout << ​"myvector contains:"​; }
for ​(​int ​i=0; i<myvector.size(); ++i) cout
<< ​' ' ​<< myvector[i];
cout << ​'\n’​; Output:
return ​0; myvector contains: 4 5 7 8 9 10
STL Algorithm

• ​Library algorithm berisi sekitar 80 template


function ​• ​header ​<algorithm>
• ​contohnya:
• ​find ​: menemukan item dalam container
• ​for_each ​: menerapkan fungsi ke setiap item
• ​copy :​ copy nilai satu container ke container lain
• ​sort ​: mengurutkan isi container

• ​Copy list ke vector:


myVector.resize(myList.size());
copy(myList.begin(), myList.end(), myVector.begin());
Contoh STL Algorithm
• ​Sort sebuah vector
sort​(a_vector.begin(), a_vector.end());
• ​Akumulasi jumlah elemen vector
int sum = ​accumulate​(a_vector.begin(), a_vector.end(), 0); cout << "Jumlah
elemen = " << sum << endl;
• ​Cek apakah elemen pertama itu terkecil
if (*a_vector.begin() !=
*​min_element​(a_vector.begin(), a_vector.end())
cerr << "Sorting error" << endl;
• ​Cek apakah elemen terakhir itu terbesar
if (*--a_vector.end() !=
*​max_element​(a_vector.begin(), a_vector.end())

cerr << "Sorting error" << endl;

Anda mungkin juga menyukai