alexa-tracking

Main Content

1024
1024
KASKUS
51
244
https://www.kaskus.co.id/thread/52cad348bdcb1731388b4735/halo-master-bantu-saya-memahami-cara-kerja-tentang-container-quotsetquot-di-c-dong
Halo master, bantu saya memahami cara kerja tentang container "set" di C++.. dong
Saya nubie sedang belajar C++, seblumnya maaf bila kiranya ada kesalahan. Saat ini saya berusaha mempelajari jenis-jenis container dalam C++ klo gak salah dalam programming ada dua macam jenis containers yaitu sequential containers dan Associative Containers.
Saya agak mudeng memahami di Associative Containers saat ini, saat ini tentang memahami set.
Masalahnya hampir gak ada tuto tentang set ini hingga sulit bagi ane tuk paham.

Gan sebenarnya gimana si cara kerja set tersebut baik element dan valuenya..?, dia klo gak salah memiliki binary tree alogaritsm di dalamnya lalu apa kegunaanya saat kita menciptakan element di dalamnya.

Ini diskripsi yg sy dapat tentang set, jelas gak cukup rasanya nubie bisa memahaminya :

Set is a Sorted Associative Container that stores objects of type Key. Set is a Simple Associative Container, meaning that its value type, as well as its key type, is Key. It is also a Unique Associative Container, meaning that no two elements are the same. Maksudnya..?

sebagi example ane ketemu contoh codingan tentang set , saya ambil dr tutorial CodingMadeEasy :

#include <iostream>
#include <set>
#include <string>
#include <iterator>


int main ( )
{

std::set <std::string> names;
typedef std::set <std::string> ::iterator it;

it iterator;

// memasukkan value element. di container set:

names.insert ("Peter");
names.insert ("CodingMadeEasy");

for (iterator = names.begin ( ) ; iterator !=names.end( ); iterator++) {
std: :cout<<*iterator<<std: :endl;
}

return 0;

}


output program diatas adalah :
CodingMadeEasy
Peter

kenapa bisa ..? gimana alur element set tersebut.

Lalu solusi kedua, yaitu memodifikasi element set dengan BOOL ditaruh di parameter nya, kok bisa apa maksud BOOL value ini, gimana cara kerja value BOOL tersebut di dalam set..?
Apakah setiap Associative container ada value BOOL, dan bisa dimasukkan type data tambahan semacam itu..?

seperti contoh :

#include <iostream>
#include <set>
#include <string>
#include <iterator>

struct SortOrder
{
bool operator (const std : : string &fist, const std : : string &second)
{
int lenght1 = first.lenght ( );
int lenght2 = second.lenght ( );

if (lenght1 == lenght2)
return (first<second);

return ( lenght1 < lenght2 );
}
}


int main ( )
{

std::set <std::string> names;
typedef std::set <std::string, SortOrder > ::iterator it;

it iterator;

// memasukkan value element. di container set:

names.insert ("Peter");
names.insert ("CodingMadeEasy");

for (iterator = names.begin ( ) ; iterator !=names.end( ); iterator++) {
std: :cout<<*iterator<<std: :endl;
}

return 0;

}

Setelah memasukkan nilai Bool di dalam parameter set output jadi seperti sequential first in, first out. gak kebalik lagi

Peter
CodingMadeEasy


Oke gan tolong minta petunjuknya ya, klo gak keberatan nubie harap master ajari tentang container set tersebut ya..?emoticon-I Love Indonesia (S)
coba liat2 ini:
http://www.cplusplus.com/reference/set/set/

Pertanyaan 1:
Kenapa bisa gitu? Set/himpunan adalah kumpulan dari elemen2 yang tidak ada 2 elemen yg sama/duplikat. Ini definisi yg dikenal dalam matematik.

Gimana cara kerja set? Intinya tidak boleh ada duplikasi elemen. Berhubung detailnya tidak dispesifikasikan dalam ISO C++, jadi sepertinya implementation-dependant. Suka2 yg bikin library. Mungkin MSVC pake binary tree, GCC pake red black tree, etc.

Pertanyaan 2:
Gak jelas. Tapi coba liat lagi link yg gw kasih

"Ordered

The elements in the container follow a strict order at all times. All inserted elements are given a position in this order."

Ini utk menentukan penempatan elemen2 dalam set. melihat code diatas, sepertinya diurutkan berdasarkan panjang string. yg lebih pendek muncul duluan.
Quote:Original Posted By kuanvidravx8

Gan sebenarnya gimana si cara kerja set tersebut baik element dan valuenya..?, dia klo gak salah memiliki binary tree alogaritsm di dalamnya lalu apa kegunaanya saat kita menciptakan element di dalamnya.

Secara general implementasi dari STL di C++ tergantung dari compilernya, untuk sekarang mungkin ngga perlu dipikirin terlalu jauh dulu gimana implementasi dari associative list, tapi bener itu pake tree.

Quote:Original Posted By kuanvidravx8

Set is a Sorted Associative Container that stores objects of type Key. Set is a Simple Associative Container, meaning that its value type, as well as its key type, is Key. It is also a Unique Associative Container, meaning that no two elements are the same. Maksudnya..?

Hmm, daripada saya jelasin dengan istilah matematika, mungkin lebih gampang kalau kamu liat contoh dari associative list di bahasa pemrograman lain. Contoh:

Di javascript
Code:

var test = { 'foo': 'bar', 'baz': 'blah };


Di PHP:
Code:

$test = array("foo" => "bar", "baz" => "blah");


Di Python:
Code:

test = { 'foo': 'bar', 'baz': 'blah }


Semuanya maksudnya sama: key "foo" memiliki value "bar" dan key "baz" memiliki value "blah". Pendeknya, ada mapping antara key dengan value (ada pasangannya).

Balik lagi ke set di C++, dia adalah associative container (list) yang key-nya dan value-nya sama, contohnya misal seperti ini:

Code:

key "foo" punya value "foo"
key "bar" punya value "bar"


Selain itu, di dalam set, ngga ada key yang sama, yang berimplikasi ngga ada value yang sama di dalam set tersebut. Ngerti sampe sini?

Quote:Original Posted By kuanvidravx8

int main ( )
{
std::set <std::string> names;
typedef std::set <std::string> ::iterator it;

it iterator;

// memasukkan value element. di container set:

names.insert ("Peter");
names.insert ("CodingMadeEasy");

for (iterator = names.begin ( ) ; iterator !=names.end( ); iterator++) {
std: :cout<<*iterator<<std: :endl;
}

return 0;
}


output program diatas adalah :
CodingMadeEasy
Peter

kenapa bisa ..? gimana alur element set tersebut.


Adalah sangat penting untuk membaca dokumentasi. Coba liat disini
http://www.cplusplus.com/reference/set/set/

Quote:
Sets are containers that store unique elements following a specific order.

template < class T, // set::key_type/value_type
class Compare = less<T>, // set::key_compare/value_compare
class Alloc = allocator<T> // set::allocator_type
> class set;


template class set terdiri dari class type, comparator type/function, dan allocator type/function.

Class type tentunya tipe data dari elemen-elemen di dalam set, easy. Contohnya string seperti contoh di atas.

Comparator type ini mendefinisikan bagaimana elemen diurutkan didalam container. Contoh: diurutkan berdasarkan panjang string, diurutkan berdasarkan nilai angka, dsb. Kalau comparator type tidak secara eksplisit disebutkan, comparator tersebut default kepada std::less (http://www.cplusplus.com/reference/f...nctional/less/).

Di contoh diatas, string dibandingkan berdasarkan ASCII value. Karena "CodingMadeEasy" < "Peter", string "CodingMadeEasy" diurutkan sebagai elemen pertama di container. Ngerti?


Quote:Original Posted By kuanvidravx8

Lalu solusi kedua, yaitu memodifikasi element set dengan BOOL ditaruh di parameter nya, kok bisa apa maksud BOOL value ini, gimana cara kerja value BOOL tersebut di dalam set..?
Apakah setiap Associative container ada value BOOL, dan bisa dimasukkan type data tambahan semacam itu..?

struct SortOrder
{
bool operator (const std : : string &fist, const std : : string &second)
{
int lenght1 = first.lenght ( );
int lenght2 = second.lenght ( );

if (lenght1 == lenght2)
return (first<second);

return ( lenght1 < lenght2 );
}
}


int main ( )
{

std::set <std::string> names;
typedef std::set <std::string, SortOrder > ::iterator it;

it iterator;

// memasukkan value element. di container set:

names.insert ("Peter");
names.insert ("CodingMadeEasy");

for (iterator = names.begin ( ) ; iterator !=names.end( ); iterator++) {
std: :cout<<*iterator<<std: :endl;
}

return 0;

}

Output:
Peter
CodingMadeEasy



Seperti yang saya jelaskan sebelumnya, SortOrder itu comparator type yang secara eksplisit didefinisikan untuk iteratornya.
Code:

std::set <std::string> names;
typedef std::set <std::string,[color=blue] SortOrder[/color] > ::iterator it;

Dengan begitu, elemen di dalam container diurutkan berdasarkan aturan dari SortOrder. Disitu secara eksplisit didefinisikan bahwa semua elemen dalam container harus diurutkan berdasarkan panjang karakternya. Karena "Peter" < "CodingMadeEasy", string "Peter" diurut di posisi didepan "CodingMadeEasy". Jadi ngga ada urusannya sama sekali dengan FIFO/LIFO.

Supaya lebih ngerti, coba kamu eksperimen sedikit dengan membuat comparator yang mengurutkan berdasarkan karakter pertama dalam string.
Quote:Original Posted By mnemonix
coba liat2 ini:
http://www.cplusplus.com/reference/set/set/

Pertanyaan 1:
Kenapa bisa gitu? Set/himpunan adalah kumpulan dari elemen2 yang tidak ada 2 elemen yg sama/duplikat. Ini definisi yg dikenal dalam matematik.

Gimana cara kerja set? Intinya tidak boleh ada duplikasi elemen. Berhubung detailnya tidak dispesifikasikan dalam ISO C++, jadi sepertinya implementation-dependant. Suka2 yg bikin library. Mungkin MSVC pake binary tree, GCC pake red black tree, etc.

Pertanyaan 2:
Gak jelas. Tapi coba liat lagi link yg gw kasih

"Ordered

The elements in the container follow a strict order at all times. All inserted elements are given a position in this order."

Ini utk menentukan penempatan elemen2 dalam set. melihat code diatas, sepertinya diurutkan berdasarkan panjang string. yg lebih pendek muncul duluan.


Quote:Original Posted By mango

Secara general implementasi dari STL di C++ tergantung dari compilernya, untuk sekarang mungkin ngga perlu dipikirin terlalu jauh dulu gimana implementasi dari associative list, tapi bener itu pake tree.


Hmm, daripada saya jelasin dengan istilah matematika, mungkin lebih gampang kalau kamu liat contoh dari associative list di bahasa pemrograman lain. Contoh:

Di javascript
Code:

var test = { 'foo': 'bar', 'baz': 'blah };


Di PHP:
Code:

$test = array("foo" => "bar", "baz" => "blah");


Di Python:
Code:

test = { 'foo': 'bar', 'baz': 'blah }


Semuanya maksudnya sama: key "foo" memiliki value "bar" dan key "baz" memiliki value "blah". Pendeknya, ada mapping antara key dengan value (ada pasangannya).

Balik lagi ke set di C++, dia adalah associative container (list) yang key-nya dan value-nya sama, contohnya misal seperti ini:

Code:

key "foo" punya value "foo"
key "bar" punya value "bar"


Selain itu, di dalam set, ngga ada key yang sama, yang berimplikasi ngga ada value yang sama di dalam set tersebut. Ngerti sampe sini?



Adalah sangat penting untuk membaca dokumentasi. Coba liat disini
http://www.cplusplus.com/reference/set/set/



template class set terdiri dari class type, comparator type/function, dan allocator type/function.

Class type tentunya tipe data dari elemen-elemen di dalam set, easy. Contohnya string seperti contoh di atas.

Comparator type ini mendefinisikan bagaimana elemen diurutkan didalam container. Contoh: diurutkan berdasarkan panjang string, diurutkan berdasarkan nilai angka, dsb. Kalau comparator type tidak secara eksplisit disebutkan, comparator tersebut default kepada std::less (http://www.cplusplus.com/reference/f...nctional/less/).

Di contoh diatas, string dibandingkan berdasarkan ASCII value. Karena "CodingMadeEasy" < "Peter", string "CodingMadeEasy" diurutkan sebagai elemen pertama di container. Ngerti?




Seperti yang saya jelaskan sebelumnya, SortOrder itu comparator type yang secara eksplisit didefinisikan untuk iteratornya.
Code:

std::set <std::string> names;
typedef std::set <std::string,[color=blue] SortOrder[/color] > ::iterator it;

Dengan begitu, elemen di dalam container diurutkan berdasarkan aturan dari SortOrder. Disitu secara eksplisit didefinisikan bahwa semua elemen dalam container harus diurutkan berdasarkan panjang karakternya. Karena "Peter" < "CodingMadeEasy", string "Peter" diurut di posisi didepan "CodingMadeEasy". Jadi ngga ada urusannya sama sekali dengan FIFO/LIFO.


Supaya lebih ngerti, coba kamu eksperimen sedikit dengan membuat comparator yang mengurutkan berdasarkan karakter pertama dalam string.


Wuihh mantap gan, makasih dah berkenan ngasih sedikit petunjuk. Ok ane coba pelajari dan pahami petunjuk mastah-mastah. emoticon-Recommended Seller

Cuma sekarang ane bingung yang struct operator Bool, gimana alur nya kok bisa mempengaruhi parameter set seperti diatas. Belum nyambung ..emoticon-Bingung (S)
Masih bingung memahami si bool tersebut, Yang satu parameter string, artinya si set diharapkan menerima data string, OK di container nerima string... Nah bool operatornya. Apa si set nerima masukkan string dulu sbg elementnya, lalu data string tersebut diolah ke data bool lalu lalu keluar deh outputnya. (karena menggunakan iterator sbg outputnya nah iterator dr yg udah ane pelajari adalah pointer ke element suatu container terdiri dari dua point first dan second, jadi si string sbg first dan second sbg bool), lalu kok bisa keluar outpot boolnya...?
kayanx ane perlu dalam lagi memahami Fungsi operator overloading di dalam struct tersebut.

wah tambah ngaco kayannya.emoticon-Ngakak

iya si ane blom nyoba2 experiment dengan set si gan, tapi karna di tuto dah nyampe set, ane coba dulu tuk belajar teori set.

Nah si data bool ini sesuai coding diatas adalah berupa struct dan operator overloading ane blom terbiasa memahami struct tersebut klo dah sedikit complex cara kerjanya, walo ane dikit ngerti apa itu struct dan kerjanya, masalahnya ane belajar blom nyampe struct juga, maklum ane belajar scra mandiri.
Dan untuk operator overloading ane baru mempelajarinya nya di class itupun masih logika simple.
Quote:Original Posted By kuanvidravx8

Cuma sekarang ane bingung yang struct operator Bool, gimana alur nya kok bisa mempengaruhi parameter set seperti diatas.

Masih bingung memahami si bool tersebut, Yang satu parameter string, artinya si set diharapkan menerima data string, OK di container nerima string... Nah bool operatornya. Apa si set nerima masukkan string dulu sbg elementnya, lalu data string tersebut diolah ke data bool lalu lalu keluar deh outputnya. (karena menggunakan iterator sbg outputnya nah iterator dr yg udah ane pelajari adalah pointer ke element suatu container terdiri dari dua point first dan second, jadi si string sbg first dan second sbg bool), lalu kok bisa keluar outpot boolnya...?
kayanx ane perlu dalam lagi memahami Fungsi operator overloading di dalam struct tersebut.


Sekali lagi itulah pentingnya baca dokumentasi dan referensi. (lihat http://www.cplusplus.com/reference/set/set/)

Paling atas
Quote:
template < class T, // set::key_type/value_type
class Compare = less<T>, // set::key_compare/value_compare
class Alloc = allocator<T> // set::allocator_type
> class set;

Udah saya jelasin diatas.

Paragraf ketiga
Quote:
Internally, the elements in a set are always sorted following a specific strict weak ordering criterion indicated by its internal comparison object (of type Compare).

Apa artinya? setiap kamu insert elemen baru, set selalu sort elemen tersebut didalam set. Penting disini bahwa sorting terjadi secara internal. Jadi ngga seperti list/vector/queue/deque yang berdasarkan FIFO/LIFO.

Programmer ngga perlu tau algoritma sorting apa yang dipakai, karena sudah diimplementasikan oleh yang mengimplementasikan STL dan compiler yang dipakai.

Sampai sini ngerti?
Pertanyaan selanjutnya: sorting berdasarkan apa?

Kebawah dikit
Quote:
Compare
...
This can be a function pointer or a function object (see constructor for an example). This defaults to less<T>, which returns the same as applying the less-than operator (a<b).


Oh, ternyata kalau comparator secara tidak secara eksplisit didefinisikan sebagai template argument, sorter yang dipakai adalah std::less<T> yang mengembalikan nilai a < b. (ini saya terjemahkan 1:1 lho dari referensi tsb, ngga bikin kalimat sendiri).

Sekarang, apa comparator itu? Mari kita lupakan sedikit soal set dan internal sort nya. Misal kamu punya himpunan angka A = {4, 3, 2}. Kamu mau sort himpunan tersebut dari kecil ke besar. Salah satu kemungkinan algoritmanya:

1. 4 > 3, geser => sekarang A = {3, 4, 2}
2. 4 > 2, geser => sekarang A = {3, 2, 4}
3. 3 > 2, geser => sekarang A = {2, 3, 4}
4. 3 < 4, stay => himpunan ngga berubah
5. 2 < 3, stay => himpunan ngga berubah

Gampang kan? Sekarang kamu liat kan diatas ada perbandingan antara satu elemen dengan elemen yang lainnya: 4 dibandingkan dengan 3, 4 dibandingkan dengan 2, 3 dibandingkan dengan 2, dst. Ini yang namanya comparator: definisi apakah sebuah elemen lebih kecil/lebih besar daripada sebuah elemen lain.

Pertanyaanya: kalau kamu punya satu himpunan yang isinya angka, jelas kamu bisa tau mana yang lebih kecil dan mana yang lebih besar. Kamu tahu 1 < 2 karena secara matematis sudah didefinisikan. Nah, kalau kamu punya himpunan yang berisi string? Bagaimana sortingnya? Ini yang harus kamu definisikan. Misal berdasarkan panjang karakter, alfabetis, berdasarkan huruf besar/kecil, dan sebagainya. Untuk itu kamu harus mendefinisikan comparator sendiri.

Comparator ini yang harus/bisa kamu definisikan sebagai template parameter:
1. Saat initialisasi obyek set. Contoh:
Code:

std::set<std::string, Comparator> my_set;
....
// insert element
....
std::set<std::string>::iterator iter = my_set.begin();
while(iter != my_set.end()) {
...
}

Artinya: setiap kamu insert, elemen akan selalu di-sort menggunakan comparator Comparator<T>. Pas di-iterasi dengan iterator, si iterator tidak akan sort sekali lagi setiap elemen (membandingkan setiap elemen dengan setiap elemen) karena kamu secara implisit bilang iterator tidak butuh di sort (ngga pake comparator).Hasilnya, kamu sort elemen di dalam list cuma 1 kali. Tentunya ini bisa saja berbeda, tergantung implementasi dari compiler.

2. Dan/atau saat Iterasi elemen dengan iterator. Contoh:
Code:

std::set<std::string> my_set;
std::set<std::string, Comparator>::iterator iter = my_set.begin();
....
// insert element
....
while(iter != my_set.end()) {
...
}

Artinya: setiap kamu insert, elemen akan selalu di-sort menggunakan comparator std::less<T>. Pas di-iterasi dengan iterator, si iterator akan sort sekali lagi setiap elemen (membandingkan setiap elemen dengan setiap elemen) di dalam set dengan fungsi Comparator. Hasilnya, kamu sort elemen di dalam list 2 kali dengan 2 comparator yang berbeda.

Sekarang kita lihat bentuk dari comparator itu seperti apa sih? Kita baca part yang sama dari penjelasan di referensi set.
Quote:
Compare
A binary predicate that takes two arguments of the same type as the elements and returns a bool. The expression comp(a,b), where comp is an object of this type and a and b are key values, shall return true if a is considered to go before b in the strict weak ordering the function defines.
...
This can be a function pointer or a function object


Dari penjelasan tersebut kita tahu, bahwa comparator itu:
1. adalah sebuah function
2. punya dua argumen yang tipenya sama. Misal dua argument int, dua argument string, dst.
3. adalah sebuah function yang return boolean value. Signaturenya misal bool pembanding(a, b). TRUE kalau a < b, FALSE selain itu.
4. bukan sembarang fungsi, tetapi berupa function pointer atau function object

Saya ingetin sekali lagi, kenapa parameternya cuma 2? Ya karena dia adalah definisi kapan sebuah elemen itu lebih kecil/besar daripada sebuah elemen lain (perhatiin yang saya garisbawahi).

Copy paste dari atas (biar inget):
Comparator: definisi apakah sebuah elemen lebih kecil/lebih besar daripada sebuah elemen lain.

Poin saya yang keempat (fungsi yang berupa function pointer atau function object):

Kita kan sudah tahu nih, bahwa default comparator untuk set adalah std::less<T>, berarti kita tahu dong bahwa std::less<T> adalah either function pointer atau function object. Mari kita lihat lagi referensinya
(http://www.cplusplus.com/reference/f...nctional/less/)

Paragraf 2
Quote:
Generically, function objects are instances of a class with member function operator() defined. This member function allows the object to be used with the same syntax as a function call.

Oh gampang ternyata membaca itu. Ternyata std::less<T> itu function object. Pertanyaanya sekarang: contoh bentuk function object itu seperti apa? Kita lihat lagi dokumentasi yang sama

Kebawah sedikit
Quote:
template <class T> struct less : binary_function <T,T,bool> {
bool operator() (const T& x, const T& y) const {return x<y;}
};


Oh berdasarkan yang barusan kita baca, ternyata function object itu:
1. Class yang mendefinisikan secara eksplisit operator()
2. Definisi dari operator() return boolean
3. Definisi dari operator() punya 2 argumen dengan tipe data yang sama.
4. Struct ternyata mirip-mirip dengan class ya. Buktinya, walaupun diatas ditulis function object itu berupa class, contoh diatas menunjukkan pake struct.

Artinya apa? Misal saya mau buat comparator yang membandingkan dua buah string berdasarkan karakter pertamanya, saya bisa bikin seperti ini:
Code:

struct Comparator
{
bool operator() (const std::string &a, const std::string &b)
{
return a[0] < b[0];
}
};


atau ekuivalen seperti ini

Code:

class Comparator
{
public:
bool operator() (const std::string &a, const std::string &b)
{
return a[0] < b[0];
}
};


Pertanyaan: Karena comparator diatas bentuknya class, bisa ngga kita pakai operator() bukan cuma untuk sebagai parameter di template set? Ya bisa. Kita bisa pakai untuk compare seperti biasa juga. Misal:

Code:

Comparator c;
std::cout << c("a", "b") << std::endl; // true
std::cout << c("b", "a") << std::endl; // false


Sama dengan struct.

Saya kasih contoh full mengenai set dengan comparator class (bukan struct), dengan comparator yang mengurutkan berdasarkan huruf pertamanya saja.

Code:

#include <iostream>
#include <string>
#include <set>

class Comparator
{
public:
bool operator() (const std::string &a, const std::string &b)
{
return a[0] < b[0];
}
};

int main() {
std::set<std::string, Comparator> my_set;
my_set.insert("foo");
my_set.insert("bar");
my_set.insert("world");
my_set.insert("hello");
my_set.insert("alabama");

std::set<std::string>::iterator iter = my_set.begin();

while(iter != my_set.end()) {
std::cout << *iter << std::endl;
iter++;
}

return 0;
}


output:
Quote:
alabama
bar
foo
hello
world


Terakhir, tips buat kamu yang lagi belajar pemrograman: apapun bahasanya, coba dibiasakan untuk mengerti dokumentasi dan referensi. Mereka biasanya dijabarkan dengan kalimat yang singkat dan padat, jadi jangan cuma sekedar baca. Seperti saya contohkan diatas, dari beberapa kalimat pendek saja ternyata bisa mengandung penjelasan yang kalau dijabarkan bisa panjang sekali. Selain itu, coba kamu eksperimen dengan mengubah contohnya. Learning by doing yang dibarengi dengan membaca biasanya jauh lebih cepet ngerti daripada cuma buta learning by doing atau sama sekali ngga praktek.
AMAziiing MAntab gan !!! WOW LEngkap sekaliii, THANKS banget gan, terima kasih atas kesabarannya mo ngetik ngasih pelajaran ampe selengkap ini.

Sebenarnya agan mungkin gak perlu serepot ini bila saya mo membaca ini sebelumnya emoticon-Cape d... (S):

Quote:Original Posted By mango

Adalah sangat penting untuk membaca dokumentasi. Coba liat disini
http://www.cplusplus.com/reference/set/set/



template class set terdiri dari class type, comparator type/function, dan allocator type/function


THIS IS A SET default function in its body, it created from these alogaritsm.

Quote:Original Posted By mango

Sekarang, apa comparator itu? Mari kita lupakan sedikit soal set dan internal sort nya. Misal kamu punya himpunan angka A = {4, 3, 2}. Kamu mau sort himpunan tersebut dari kecil ke besar. Salah satu kemungkinan algoritmanya:

1. 4 > 3, geser => sekarang A = {3, 4, 2}
2. 4 > 2, geser => sekarang A = {3, 2, 4}
3. 3 > 2, geser => sekarang A = {2, 3, 4}
4. 3 < 4, stay => himpunan ngga berubah
5. 2 < 3, stay => himpunan ngga berubah



Iya ngerti gan, inilah bentuk binary tree alogaritsm atau red tree dalam fungsi comparator default yang berfungsi melakukan pemilahan element sesuai keinginan creator. Ane sebenernya gak perlu berpikir kesini sebelumnya, kecuali mo bikin alogaritsm sendiri.

1. Saat initialisasi obyek set. Contoh:
Code:

std::set<std::string, Comparator> my_set;
....
// insert element
....
std::set<std::string>::iterator iter = my_set.begin();
while(iter != my_set.end()) {
...
}


Iya ini default comparator yg call oleh my set.



2. Dan/atau saat Iterasi elemen dengan iterator. Contoh:
Code:

std::set<std::string> my_set;
std::set<std::string, Comparator>::iterator iter = my_set.begin();
....
// insert element
....
while(iter != my_set.end()) {
...
}


ini adalah comparator dlm objcet iterator.

Quote:Original Posted By mango

Dari penjelasan tersebut kita tahu, bahwa comparator itu:
1. adalah sebuah function
2. punya dua argumen yang tipenya sama. Misal dua argument int, dua argument string, dst.
3. adalah sebuah function yang return boolean value. Signaturenya misal bool pembanding(a, b). TRUE kalau a < b, FALSE selain itu.
4. bukan sembarang fungsi, tetapi berupa function pointer atau function object


Function pointer saya mungkin dah ketemu tapi blom bisa membayangkan seperti apa atau apa itu persisnya. Walo scra praktek gak sengaja mungkin pernah ane pake.
Function object, mantap gan skrg saya tau apa itu. Sebelumnya saya blom nyampe pelajaran ini, baru saat ini ngerti dgn istilah "Function object" itu.

akan saya pelajari disini nanti, biar mudeng :

http://www.cprogramming.com/tutorial...ts-in-c++.html

Quote:Original Posted By mango

Saya ingetin sekali lagi, kenapa parameternya cuma 2? Ya karena dia adalah definisi kapan sebuah elemen itu lebih kecil/besar daripada sebuah elemen lain (perhatiin yang saya garisbawahi).


Setelah elements key/value diinsert di container, Saat program jalan, Menggunakan comparator A dan B dibandingkan dulu berdasar perintah alogaritma dalam body comparator, lalu menggunakan A atau B dibandingkan dengan C dan atau seterusnya. Akan saya coba untuk memahami alurnya lagi saat ini cuma baru bayang-bayang.


Code:

struct Comparator
{
[color=red] bool operator()[/color] (const std::string &a, const std::string &b)
{
return a[0] < b[0];
}
};


Ane salah sebelumnya asal tebak, asal jawab ini saya bilang operator overloading maklum kmrn belajar operator overloading di class he he he, Apakh ini syntax function object...?

Oke coba ane pelajari n experiment, sw petunjuk master mango.
males bantu anda,anda sendiri gak menghargai orang lain punya kreativitas