C ++

Bekas Unik dan Teratur dalam C ++

Bekas Unik dan Teratur dalam C ++
6, 10, 2, 8, 4 adalah satu set; 2, 4, 6, 8, 10 adalah sekumpulan bilangan bulat yang sama, disusun dalam urutan menaik. Dalam Matematik, satu set mempunyai unsur unik (elemen berbeza), dan itu, tidak ada unsur yang berlaku lebih dari satu kali. Selanjutnya, multiset adalah satu set, di mana unsur apa pun boleh berlaku lebih dari sekali. 6, 6, 10, 2, 2, 8, 4, 4, 4 ialah multiset. 2, 2, 4, 4, 4, 6, 6, 8, 10 adalah multiset yang sama, tetapi dengan elemen yang disusun dalam urutan menaik. Artikel ini tidak berkaitan dengan multiset. Ia berkaitan dengan struktur data C ++ yang disebut, set.

Peta dalam perisian adalah seperti array, tetapi merupakan array dengan dua lajur dan bukannya satu lajur. Lajur pertama mempunyai kunci dan lajur kedua mempunyai nilai. Setiap baris adalah satu pasangan, menjadikan pasangan kunci / nilai. Kunci berkaitan secara langsung dengan nilainya.

Contoh peta ialah 'c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10. Pasangan kunci / nilai pertama yang dimasukkan di sini, adalah 'c', 3, di mana 'c' adalah kunci dan 30 adalah nilai. Peta ini tidak disusun mengikut kunci. Memesan peta ini dengan kunci menghasilkan 'a', 10, 'b', 20, 'c', 30, 'd', 30, 'e', 40. Perhatikan bahawa boleh ada nilai pendua, tetapi bukan kunci pendua. Peta yang dipesan adalah peta yang disusun mengikut kunci.

Multiset adalah untuk satu set, seperti multimap ke peta. Ini bermaksud bahawa terdapat peta dengan kunci pendua. Contoh multimap adalah 'a', 10, 'b', 20, 'b', 20, 'c', 30, 'c', 30, 'd ', 30, ' e ', 40. Dan seperti yang dinyatakan di atas, artikel ini tidak berkaitan dengan multimap, sebaliknya, ia berkaitan dengan struktur data C ++ yang disebut, peta.

Dalam C ++, struktur data adalah struktur dengan sifat (anggota data) dan kaedah (fungsi anggota). Data struktur adalah senarai; satu set adalah senarai; peta adalah senarai pasangan kunci / nilai.

Artikel ini membincangkan asas-asas set dan peta di C ++, dan untuk lebih memahami artikel ini, pembaca semestinya mempunyai pengetahuan asas mengenai C++.

Kandungan Artikel:

Kelas dan Objektifnya:

Dalam C ++, set, peta, dan struktur serupa yang lain disebut wadah. Kelas adalah unit umum dengan anggota data, yang merupakan pemboleh ubah, dan fungsi anggota yang berkaitan. Apabila anggota data diberi nilai, objek terbentuk. Namun, sebuah objek terbentuk dalam proses yang disebut, instantiasi. Oleh kerana kelas boleh membawa kepada nilai yang berbeza untuk pemboleh ubah anggota data yang sama, objek yang berlainan kemudian dapat dibuat dari kelas yang sama.

Dalam C ++, satu set yang tidak dapat digunakan adalah kelas, dan juga peta yang tidak dapat digunakan. Apabila objek dibuat dari kumpulan yang tidak dapat digunakan atau peta yang tidak dapat digunakan, objek tersebut menjadi struktur data yang sebenarnya. Dengan susunan dan struktur data peta, anggota data utama adalah senarai. Nah, kumpulan dan peta membentuk sekumpulan bekas yang dipanggil, bekas bersekutu yang dipesan. Set yang tidak disusun dan peta yang tidak disusun juga ada, tetapi malangnya itu tidak dibahas dalam artikel ini.

Membuat set atau peta:

Instantiating set dari kelas setnya adalah membuat satu set; menunjukkan peta dari kelas peta adalah membuat peta. Objek yang dibuat sedemikian diberi nama pilihan pengaturcara.

Untuk membuat set, program harus dimulakan dengan:

#sertakan
#sertakan
menggunakan ruang nama std;

Perhatikan arahan “#include ", Yang merangkumi perpustakaan set yang mempunyai kelas set dari mana struktur data set akan dibuat.

Untuk membuat peta, program harus dimulakan dengan:

#sertakan
#sertakan
menggunakan ruang nama std;

Perhatikan arahan “#include ", Yang merangkumi perpustakaan peta yang memiliki kelas peta dari mana struktur data peta akan dibuat.

Sintaks untuk membuat set kosong adalah:

set objekNama

Contoh:

set setObj;

Contoh untuk membuat set dengan kandungan adalah:

set setObj (6, 10, 2, 8, 4);

Sintaks untuk membuat peta kosong adalah:

peta objekNama

Contoh:

peta petaObj;

Contoh untuk membuat peta dengan kandungan adalah:

peta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);

Asas Pengulangan:

Iterator adalah penunjuk yang terperinci, yang dapat digunakan untuk melintasi senarai struktur data dari awal hingga akhir.

Fungsi anggota mula ()

Fungsi anggota mula () mengembalikan iterator yang menunjukkan elemen pertama dalam senarai. Contoh berikut menggambarkan ini untuk set:

set setObj (6, 10, 2, 8, 4);
set:: iterator iter = setObj.bermula ();
cout << *iter << '\n';

Perhatikan cara mula () telah digunakan dengan setObj dan operator titik. iter adalah objek iterator yang dikembalikan. Juga, perhatikan cara yang telah dinyatakan. * adalah pengendali tidak langsung. Seperti yang digunakan dengan iter, ia mengembalikan elemen pertama set; elemen pertama adalah 2 bukannya 6 - lihat penjelasan di bawah.

Contoh berikut menggambarkan penggunaan fungsi begin () untuk peta:

peta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
peta:: iterator iter = mapObj.bermula ();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Perhatikan cara mula () telah digunakan dengan mapObj dan operator titik. iter adalah objek iterator yang dikembalikan. Juga, perhatikan cara yang telah dinyatakan. "Pertama", seperti yang digunakan di sini, merujuk kepada kunci. "Kedua" merujuk kepada nilai yang sepadan dengan kunci. Perhatikan bagaimana ia digunakan dengan iter untuk mendapatkan komponen elemen permulaan dalam senarai. Elemen pertama ialah a, 10 dan bukannya c, 30 - lihat penjelasan di bawah.

Fungsi anggota "begin () const"

Fungsi anggota "begin () const" mengembalikan iterator yang menunjuk ke elemen pertama dalam senarai ketika deklarasi set bermula dengan const (untuk pemalar). Dalam keadaan ini, nilai dalam senarai, yang disebut oleh iterator yang dikembalikan, tidak dapat diubah oleh iterator. Contoh berikut menggambarkan penggunaannya untuk set:

set const setObj (6, 10, 2, 8, 4);
set:: const_iterator iter = setObj.bermula ();
cout << *iter << '\n';

Perhatikan cara mula () telah digunakan dengan setObj dan operator titik. Tidak ada "const" yang telah ditaip setelah bermula (). Namun, "const" telah mendahului deklarasi tersebut. di sini adalah objek iterator malar yang dikembalikan, yang berbeza dari iterator biasa. Juga, perhatikan cara yang telah dinyatakan. * adalah pengendali tidak langsung; seperti yang digunakan dengan iter, ia mengembalikan elemen pertama set. Elemen pertama adalah 2 bukannya 6 - lihat penjelasan di bawah.

Contoh berikut menggambarkan penggunaan fungsi “begin () const” untuk peta:

peta const mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
peta:: const_iterator iter = mapObj.bermula ();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Perhatikan cara mula () telah digunakan dengan mapObj dan operator titik. Tidak ada "const" yang telah ditaip setelah bermula (). Namun, "const" telah mendahului deklarasi tersebut. di sini adalah objek iterator malar yang dikembalikan, yang berbeza dari iterator biasa. Juga, perhatikan cara yang telah dinyatakan. "Pertama", seperti yang digunakan di sini, merujuk kepada kunci; "Kedua", seperti yang digunakan di sini, merujuk pada nilai yang sesuai dengan kunci. Perhatikan bagaimana ia digunakan dengan iter untuk mendapatkan komponen elemen permulaan dalam senarai. Elemen pertama ialah a, 10 dan bukannya c, 30 - lihat penjelasan di bawah.

Fungsi anggota akhir ()

Fungsi anggota akhir () mengembalikan iterator yang menunjukkan tepat selepas akhir senarai. Contoh berikut menggambarkan ini untuk set:

set setObj (6, 10, 2, 8, 4);
set:: iterator iter = setObj.akhir ();
cout << *iter << '\n';

Perhatikan cara end () telah digunakan dengan setObj dan operator titik. iter adalah objek iterator yang dikembalikan. Juga, perhatikan cara yang telah dinyatakan. * adalah pengendali tidak langsung; seperti yang digunakan dengan iter, ia mengembalikan elemen +1 terakhir dari set. Di komputer penulis, elemen +1 terakhir ini adalah 5, yang tidak ada dalam senarai. Jadi, berhati-hati untuk tidak menggunakan elemen ini.

Contoh berikut menggambarkan penggunaan fungsi akhir () untuk peta:

peta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
peta:: iterator iter = mapObj.akhir ();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Perhatikan cara akhir () telah digunakan dengan mapObj dan operator titik. iter adalah objek iterator yang dikembalikan. Juga, perhatikan cara yang telah dinyatakan. * adalah pengendali tidak langsung; seperti yang digunakan dengan iter, ia mengembalikan elemen peta +1 terakhir. Di komputer penulis, elemen +1 terakhir ini adalah , 0, yang tidak ada dalam senarai. Jadi, berhati-hati untuk tidak menggunakan elemen ini.

Fungsi anggota "end () const"

Fungsi anggota "end () const" mengembalikan iterator yang menunjuk tepat setelah akhir senarai ketika deklarasi set bermula dengan const (untuk pemalar). Dalam keadaan ini, nilai dalam senarai, yang disebut oleh iterator yang dikembalikan, tidak dapat diubah oleh iterator. Contoh berikut menggambarkan penggunaannya untuk set:

set const setObj (6, 10, 2, 8, 4);
set:: const_iterator iter = setObj.akhir ();
cout << *iter << '\n';

Perhatikan cara end () telah digunakan dengan setObj dan operator titik. Tidak ada "const" yang telah ditaip setelah akhir (). Namun, "const" telah mendahului deklarasi tersebut. iter adalah objek iterator yang dikembalikan. Juga, perhatikan cara yang telah dinyatakan. * adalah pengendali tidak langsung; seperti yang digunakan dengan iter, ia mengembalikan elemen +1 terakhir dari set.

Contoh berikut menggambarkan penggunaan fungsi "end () const" untuk peta:

peta const mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
peta:: const_iterator iter = mapObj.akhir ();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Perhatikan cara akhir () telah digunakan dengan mapObj dan operator titik. Tidak ada "const" yang telah ditaip setelah akhir (). Namun, "const" telah mendahului deklarasi tersebut. iter adalah objek iterator malar yang dikembalikan, yang berbeza dari iterator biasa. Juga, perhatikan dengan teliti cara yang telah dinyatakan.

Akses Elemen untuk set dan peta:

Tetapkan

Dengan set, elemen dibaca menggunakan pengendali tidak langsung. Dua elemen pertama dari satu set dibaca dalam contoh berikut:

set setObj (6, 10, 2, 8, 4);
set:: iterator iter = setObj.bermula ();
cout << *iter << '\n';
++iter;
cout << *iter << '\n';

Keluarannya adalah 2, kemudian diikuti oleh 4 - lihat penjelasan di bawah. Untuk menunjukkan elemen seterusnya dalam senarai, iterator meningkat.

Catatan: Elemen tidak dapat diubah menggunakan pengendali tidak langsung untuk set. Contohnya, “* iter = 9;” tidak mungkin.

peta

Peta terdiri daripada pasangan kunci / nilai. Nilai dapat dibaca menggunakan kunci yang sesuai, dan diubah menggunakan kunci yang sama. Segmen kod berikut menggambarkan ini:

peta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
cout << mapObj['b'] << '\n';
mapObj ['b'] = 55;
cout << mapObj['b'] << '\n';

Keluarannya adalah:

20
55

Pengendali titik tidak digunakan di sini. Sebaliknya, ia adalah operator kurungan persegi, yang mengambil kunci sebagai kandungan, yang telah digunakan.

Susunan Unsur dalam satu set atau peta:

Elemen boleh dimasukkan ke dalam satu set, mengikut urutan apa pun. Namun, setelah dimasukkan, set menyusun semula elemennya dalam urutan menaik. Urutan menaik adalah pesanan lalai. Sekiranya urutan menurun diperlukan, maka set harus dinyatakan seperti dalam contoh berikut:

set > setObj (6, 10, 2, 8, 4);

Jadi, selepas jenisnya, e.g., int, untuk templat, ada koma, diikuti dengan "lebih besarDalam kurungan sudut.

Elemen boleh dimasukkan ke dalam peta mengikut urutan apa pun. Namun, setelah dimasukkan, peta menyusun semula elemennya dalam urutan menaik mengikut kunci (hanya) sambil mengekalkan hubungan antara setiap kunci dan nilainya. Urutan menaik adalah pesanan lalai; jika urutan menurun diperlukan, maka peta harus dinyatakan seperti dalam contoh berikut:

peta > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);

Jadi, selepas pasangan jenis, e.g., "Char, int", untuk templat, ada koma, diikuti dengan "lebih besarDalam kurungan sudut.

Melintasi satu set

The while-loop atau for-loop dengan iterator dapat digunakan untuk melintasi satu set. Contoh berikut menggunakan for-loop untuk melintasi satu set yang telah dikonfigurasi dalam urutan menurun:

set > setObj (6, 10, 2, 8, 4);
untuk (set:: iterator iter = setObj.bermula (); iter != setObj.akhir (); ++ iter)

cout << *iter << ";

Keluarannya adalah:

10 8 6 4 2

Penambahan iterator menunjuknya ke elemen seterusnya.

Melintasi peta

The while-loop atau for-loop dengan iterator dapat digunakan untuk melintasi peta. Contoh berikut menggunakan for-loop untuk melintasi peta yang telah dikonfigurasi dalam urutan menurun:

peta > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
untuk (peta:: iterator iter = mapObj.bermula (); iter != petaObj.akhir (); ++ iter)

cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Keluarannya adalah:

e, 40, d, 30, c, 30, b, 20, a, 10,

Penambahan iterator menunjuknya ke elemen seterusnya. "Pertama", dalam kod, merujuk pada kunci dan "kedua" merujuk pada nilai yang sesuai. Perhatikan bagaimana nilai-nilai ini diperoleh untuk output.

Fungsi Ahli Yang Lain Yang Digunakan:

Ukuran () Fungsi

Fungsi ini mengembalikan bilangan bulat, yang merupakan bilangan elemen dalam senarai. Contohnya:

set > setObj (6, 10, 2, 8, 4);
cout << setObj.size() << '\n';

Keluarannya adalah 5.

Contoh peta:

peta > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
cout << mapObj.size() << '\n';

Keluarannya adalah 5.

Fungsi sisipan ()

set

set tidak membenarkan pendua. Oleh itu, sebarang pendua yang dimasukkan ditolak secara senyap. Dengan set, argumen ke fungsi insert () adalah nilai yang akan dimasukkan. Nilai dipasang ke posisi, di mana urutan dalam set tetap menaik atau menurun. Contoh:

set setObj (6, 10, 2, 8, 4);
setObj.masukkan (6);
setObj.masukkan (9);
setObj.masukkan (12);
untuk (set:: iterator iter = setObj.bermula (); iter != setObj.akhir (); ++ iter)

cout << *iter << ";

Keluarannya adalah:

2 4 6 8 9 10 12

Catatan: Fungsi anggota sisipan () dapat digunakan untuk mengisi satu set kosong.

peta

peta tidak membenarkan pendua dengan kunci. Jadi, sebarang pendua yang dimasukkan ditolak secara senyap. Dengan peta, argumen untuk fungsi insert () adalah pasangan kunci / nilai dalam pendakap. Elemen dipasang ke posisi dengan kunci, di mana susunan dalam peta tetap menaik atau menurun. Contoh:

peta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
petaObj.masukkan ('e', 80);
petaObj.masukkan ('f', 50);
petaObj.masukkan ('g', 60);
untuk (peta:: iterator iter = mapObj.bermula (); iter != petaObj.akhir (); ++ iter)
cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Keluarannya adalah:

a, 10, b, 20, c, 30, d, 30, e, 40, f, 50, g, 60,

Catatan: Fungsi anggota sisipan () dapat digunakan untuk mengisi peta kosong.

Fungsi kosong ()

Fungsi ini kembali benar jika senarai kosong, dan salah jika sebaliknya. Contohnya:

set setObj (6, 10, 2, 8, 4);
bool ret = setObj.kosong ();
cout << ret << '\n';

Outputnya adalah 0 untuk false, yang bermaksud set di sini tidak kosong.

Contoh peta:

peta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
bool ret = petaObj.kosong ();
cout << ret << '\n';

Keluarannya adalah 0 untuk false, yang bermaksud peta di sini tidak kosong.

Fungsi padam ()

set

Pertimbangkan segmen kod berikut:

set setObj (10, 20, 30, 40, 50);
set:: iterator iter = setObj.bermula ();
set:: iterator itr = setObj.padam (iter);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';
itr = setObj.padam (itr);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';

Keluarannya adalah:

saiz baru: 4
nilai seterusnya: 20
saiz baru: 3
nilai seterusnya: 30

Fungsi erase () mengambil iterator yang menunjukkan elemen sebagai argumen. Setelah menghapus elemen, fungsi erase () mengembalikan iterator yang menunjuk ke elemen seterusnya.

peta

Pertimbangkan segmen kod berikut:

peta mapObj ('a', 10, 'b', 20, 'c', 30, 'd', 40, 'e', 50);
peta:: iterator iter = mapObj.bermula ();
peta:: iterator itr = petaObj.padam (iter);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";
itr = petaObj.padam (itr);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";

Keluarannya adalah:

saiz baru: 4
pasangan nilai seterusnya: b, 20
saiz baru: 3
pasangan nilai seterusnya: c, 30

Fungsi erase () mengambil iterator yang menunjukkan elemen sebagai argumen. Setelah menghapus elemen, fungsi erase () mengembalikan iterator yang menunjuk ke elemen seterusnya.

Fungsi yang jelas ()

Fungsi clear () membuang semua elemen dalam senarai. Contohnya:

set setObj (6, 10, 2, 8, 4);
setObj.jelas ();
cout << setObj.size() << '\n';

Keluarannya adalah 0.

contoh peta:

peta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
petaObj.jelas ();
cout << mapObj.size() << '\n';

Keluarannya adalah 0.

Kesimpulan:

Struktur data yang ditetapkan dalam C ++ adalah struktur di mana senarai elemen disimpan dalam urutan menaik secara lalai, atau dalam urutan menurun berdasarkan pilihan pengaturcara. Semua elemen set unik. Struktur data peta dalam C ++ adalah struktur di mana daftarnya adalah hash pasangan kunci / nilai, disimpan dalam urutan menaik kekunci secara lalai, atau dalam urutan menurun kunci dengan pilihan pengaturcara. Kuncinya juga unik, dan terdapat nilai pendua. Anggota data utama dari salah satu struktur adalah senarai. Sama ada struktur mempunyai fungsi anggota, beberapa di antaranya biasanya digunakan.

10 Permainan Teratas untuk Dimainkan di Ubuntu
Platform Windows telah menjadi salah satu platform dominan untuk permainan kerana peratusan besar permainan yang sedang berkembang hari ini untuk meny...
5 Permainan Arcade Terbaik untuk Linux
Pada masa kini, komputer adalah mesin serius yang digunakan untuk permainan. Sekiranya anda tidak dapat memperoleh skor tinggi baru, anda akan tahu ma...
Battle For Wesnoth 1.13.6 Pembangunan Dikeluarkan
Battle For Wesnoth 1.13.6 dilancarkan bulan lalu, adalah rilis pengembangan keenam di 1.13.siri x dan memberikan sejumlah penambahbaikan, terutamanya ...