std::daftar masuk C++ dengan Contoh

โšก Ringkasan Cerdas

std::daftar masuk C++ adalah kontainer urutan yang diimplementasikan sebagai daftar berantai ganda, memungkinkan penyisipan dan penghapusan cepat di posisi mana pun sambil menyimpan elemen dalam memori yang tidak berdekatan dan mendukung akses sekuensial dua arah, bukan akses acak.

  • ๐Ÿ”— Daftar berantai ganda: Setiap elemen menyimpan tautan ke node sebelumnya dan berikutnya, sehingga data std::list berada di memori yang tidak berurutan.
  • โšก Sisipkan dan hapus dengan cepat: Menambah atau menghapus elemen pada posisi yang diketahui membutuhkan waktu konstan, tidak seperti vektor yang menggeser elemen.
  • ๐Ÿšซ Tidak ada akses acak: Elemen-elemen dicapai melalui penelusuran berurutan dari kedua ujung, sehingga pengindeksan seperti list[3] tidak tersedia.
  • ๐Ÿงฉ Konstruktor: Konstruktor Default, Fill, Range, Copy, Move, dan Initializer-list membangun std::list dengan cara yang berbeda.
  • ๏ธ Fungsi anggota: Fungsi push_front(), push_back(), insert(), erase(), size(), reverse(), dan merge() mengelola isi daftar.
  • ๐Ÿค– Bantuan AI: GitHub Copilot dan asisten serupa membuat kerangka deklarasi std::list, iterator, dan logika penyisipan atau penghapusan dari komentar singkat.

std::daftar masuk C++

Apa itu std::daftar?

In C++`std::list` mengacu pada sebuah kontainer penyimpanan. `std::list` memungkinkan Anda untuk memasukkan dan menghapus item dari mana saja. `std::list` diimplementasikan sebagai daftar berantai ganda. Ini berarti data dalam daftar dapat diakses secara dua arah dan berurutan.

Daftar Standard Template Library tidak mendukung akses acak cepat, tetapi mendukung akses sekuensial dari semua arah.

Anda dapat menyebarkan elemen daftar di bagian memori yang berbeda. Informasi yang diperlukan untuk akses berurutan ke data disimpan dalam sebuah wadah. std::list dapat diperluas dan diperkecil dari kedua ujungnya sesuai kebutuhan selama runtime. Pengalokasi internal secara otomatis memenuhi persyaratan penyimpanan.

Ciri-ciri ini menimbulkan pertanyaan praktis: kapan sebenarnya Anda harus menggunakan daftar?

Mengapa menggunakan std::daftar?

Berikut adalah alasan mengapa menggunakan std::list:

  • std::list berkinerja lebih baik dibandingkan dengan kontainer urutan lainnya seperti array dan vector.
  • Mereka memiliki kinerja yang lebih baik dalam memasukkan, memindahkan, dan mengeluarkantracelemen ting dari posisi mana saja.
  • std::list juga bekerja lebih baik dengan algoritma yang melakukan operasi tersebut secara intensif.

Setelah alasannya jelas, langkah selanjutnya adalah sintaks yang mendeklarasikannya.

Daftar Sintaks

Untuk mendefinisikan std::list, kita harus mengimpor berkas tajuk. Berikut adalah sintaks definisi std::list:

template < class Type, class Alloc =allocator<T> > class list;

Berikut penjelasan parameter di atas:

  • T โ€“ Mendefinisikan tipe elemen yang terkandung. Anda dapat mengganti T dengan tipe data apa pun, bahkan tipe yang ditentukan pengguna.
  • Alloc โ€“ Mendefinisikan tipe objek alokator. Secara default, ini menggunakan templat kelas alokator. Nilainya bergantung pada tipe dan menggunakan model alokasi memori yang sederhana.

Contoh 1

#include <algorithm>
#include <iostream>
#include <list>
int main() {
	std::list<int> my_list = { 12, 5, 10, 9 };

	for (int x : my_list) {
		std::cout << x << '\n';
	}
}

Keluaran:

Output dari contoh pembuatan dan iterasi std::list

Berikut ini tangkapan layar kodenya:

C++ Kode untuk membuat `std::list` dan mencetaknya menggunakan perulangan `for`.

Code Penjelasan:

  1. Sertakan file header algoritma untuk menggunakan fungsinya.
  2. Sertakan file header iostream untuk menggunakan fungsinya.
  3. Sertakan file header daftar untuk menggunakan fungsinya.
  4. Panggil fungsi main(). Logika program harus ditambahkan dalam isi fungsi ini.
  5. Buat daftar bernama my_list dengan kumpulan 4 bilangan bulat.
  6. Menggunakan untuk loop untuk membuat variabel perulangan x. Variabel ini akan digunakan untuk mengulang elemen-elemen dalam daftar.
  7. Cetak nilai daftar di konsol.
  8. Akhir dari badan perulangan for.
  9. Akhir dari isi fungsi main().

C++ Daftar Fungsi

Berikut adalah fungsi umum std::list:

fungsi Deskripsi
memasukkan() Fungsi ini menyisipkan item baru sebelum posisi yang ditunjuk iterator.
dorong_kembali() Fungsi ini menambahkan item baru di akhir daftar.
dorong_depan() Itu menambahkan item baru di bagian depan daftar.
pop_depan() Ini menghapus item pertama dalam daftar.
ukuran() Fungsi ini menentukan jumlah elemen daftar.
depan() Untuk menentukan item pertama dalam daftar.
kembali() Untuk menentukan item terakhir dalam daftar.
balik() Ini membalikkan item daftar.
menggabungkan() Ini menggabungkan dua daftar yang diurutkan.

Konstruktor

Di sini adalah daftar fungsi disediakan oleh berkas tajuk:

  • Konstruktor default std::list::list()- Ini membuat daftar kosong, dengan elemen nol.
  • Isi konstruktor std::list::list()- Ini membuat daftar dengan n elemen dan memberikan nilai nol (0) untuk setiap elemen.
  • Konstruktor rentang std::list::list()- membuat daftar dengan banyak elemen dalam rentang pertama hingga terakhir.
  • Salin konstruktor std::list::list()- Ini membuat daftar dengan salinan setiap elemen yang terdapat dalam daftar yang ada.
  • Pindahkan konstruktor std::list::list()- membuat daftar dengan elemen daftar lain menggunakan semantik pemindahan.
  • Konstruktor daftar penginisialisasi std::list::list()-Ini membuat daftar dengan elemen daftar lain menggunakan semantik pemindahan.

Contoh 2

#include <iostream>
#include <list>
using namespace std;
int main(void) {
	list<int> l;
	list<int> l1 = { 10, 20, 30 };
	list<int> l2(l1.begin(), l1.end());
	list<int> l3(move(l1));  
	cout << "Size of list l: " << l.size() << endl;
	cout << "List l2 contents: " << endl;
	for (auto it = l2.begin(); it != l2.end(); ++it)
	      cout << *it << endl;
	cout << "List l3 contents: " << endl;
	for (auto it = l3.begin(); it != l3.end(); ++it)
		cout << *it << endl;
	return 0;
}

Keluaran:

Output dari contoh konstruktor std::list

Berikut ini tangkapan layar kodenya:

C++ Kode yang mendemonstrasikan konstruktor default, range, dan move untuk std::list.

Code Penjelasan:

  1. Sertakan file header iostream untuk menggunakan fungsinya.
  2. Sertakan file header daftar untuk menggunakan fungsinya.
  3. Sertakan namespace std dalam kode untuk menggunakan kelasnya tanpa memanggilnya.
  4. Panggil fungsi main(). Logika program harus ditambahkan dalam isi fungsi ini.
  5. Buat daftar kosong bernama l.
  6. Buat daftar bernama l1 dengan himpunan 3 bilangan bulat.
  7. Buat daftar bernama l2 dengan semua elemen dalam daftar bernama l1, dari awal hingga akhir.
  8. Buat daftar bernama l3 menggunakan semantik gerakan. Daftar l3 akan memiliki konten yang sama dengan daftar l2.
  9. Cetak ukuran daftar bernama l di konsol bersama teks lainnya.
  10. Cetak beberapa teks di konsol.
  11. Buat iterator yang diberi nama dan gunakan untuk mengulangi elemen daftar bernama l2.
  12. Cetak elemen daftar bernama l2 di konsol.
  13. Cetak beberapa teks di konsol.
  14. Buat iterator yang diberi nama dan gunakan untuk mengulangi elemen daftar bernama l3.
  15. Cetak elemen daftar bernama l3 di konsol.
  16. Program harus mengembalikan nilai setelah berhasil diselesaikan.
  17. Akhir dari isi fungsi main().

Properti penampung

Berikut adalah daftar properti kontainer:

Milik Deskripsi
Urutan Kontainer urutan mengurutkan elemennya dalam urutan linier yang ketat. Elemen diakses berdasarkan posisinya dalam urutan.
Daftar tertaut ganda Setiap elemen memiliki informasi tentang cara menemukan elemen sebelumnya dan berikutnya. Hal ini memungkinkan waktu yang konstan untuk operasi penyisipan dan penghapusan.
Sadar pengalokasi Objek pengalokasi digunakan untuk mengubah ukuran penyimpanan secara dinamis.

Memasukkan ke dalam Daftar

Ada berbagai fungsi yang dapat kita gunakan untuk memasukkan nilai ke dalam sebuah daftar. Mari kita demonstrasikan:

Contoh 3

#include <algorithm>
#include <iostream>
#include <list>
int main() {
	std::list<int> my_list = { 12, 5, 10, 9 };
	my_list.push_front(11);
	my_list.push_back(18);
	auto it = std::find(my_list.begin(), my_list.end(), 10);
	if (it != my_list.end()) {
		my_list.insert(it, 21);
	}
	for (int x : my_list) {
		std::cout << x << '\n';
	}
}

Keluaran:

Output setelah memasukkan elemen ke dalam std::list

Berikut ini tangkapan layar kodenya:

C++ Kode yang menggunakan push_front, push_back, dan insert pada std::list

Code Penjelasan:

  1. Sertakan file header algoritma untuk menggunakan fungsinya.
  2. Sertakan file header iostream untuk menggunakan fungsinya.
  3. Sertakan file header daftar untuk menggunakan fungsinya.
  4. Panggil fungsi main(). Logika program harus ditambahkan dalam isi fungsi ini.
  5. Buat daftar bernama my_list dengan kumpulan 4 bilangan bulat.
  6. Masukkan elemen 11 ke depan daftar bernama my_list.
  7. Masukkan elemen 18 ke akhir daftar bernama my_list.
  8. Buat iterator dan gunakan untuk menemukan elemen 10 dari daftar my_list.
  9. Gunakan pernyataan if untuk menentukan apakah elemen di atas ditemukan atau tidak.
  10. Sisipkan elemen 21 sebelum elemen di atas jika ditemukan.
  11. Akhir dari isi pernyataan if.
  12. Gunakan perulangan for untuk membuat variabel perulangan x. Variabel ini akan digunakan untuk mengulangi elemen daftar.
  13. Cetak nilai daftar di konsol.
  14. Akhir dari badan perulangan for.
  15. Akhir dari isi fungsi main().

Elemen yang dimasukkan ke dalam daftar dapat dengan mudah dikeluarkan.

Menghapus dari Daftar

Dimungkinkan untuk menghapus item dari sebuah daftar. Fungsi erase() memungkinkan Anda untuk menghapus satu item atau rentang item dari sebuah daftar.

  • Untuk menghapus satu item, Anda cukup memasukkan satu posisi bilangan bulat. Barang tersebut akan dihapus.
  • Untuk menghapus suatu rentang, Anda memberikan iterator awal dan akhir. Mari kita demonstrasikan hal ini.

Contoh 4

#include <algorithm>
#include <iostream>
#include <list>
using namespace std;
int main() {
	std::list<int> my_list = { 12, 5, 10, 9 };
	cout << "List elements before deletion: ";
	for (int x : my_list) {
		std::cout << x << '\n';
	}
	list<int>::iterator i = my_list.begin();
	my_list.erase(i);
	cout << "\nList elements after deletion: ";
	for (int x : my_list) {
		std::cout << x << '\n';
	}
	return 0;
}

Keluaran:

Output setelah menghapus elemen dari std::list

Berikut ini tangkapan layar kodenya:

C++ kode yang menggunakan fungsi erase pada std::list

Code Penjelasan:

  1. Sertakan file header algoritma untuk menggunakan fungsinya.
  2. Sertakan file header iostream untuk menggunakan fungsinya.
  3. Sertakan file header daftar untuk menggunakan fungsinya.
  4. Sertakan namespace std dalam program kami untuk menggunakan kelasnya tanpa memanggilnya.
  5. Panggil fungsi main(). Logika program harus ditambahkan dalam isi fungsi ini.
  6. Buat daftar bernama my_list dengan kumpulan 4 bilangan bulat.
  7. Cetak beberapa teks di konsol.
  8. Gunakan perulangan for untuk membuat variabel perulangan x. Variabel ini akan digunakan untuk mengulangi elemen daftar.
  9. Cetak nilai daftar di konsol.
  10. Akhir dari badan perulangan for.
  11. Buat iterator i yang menunjuk ke elemen pertama dari daftar.
  12. Gunakan fungsi erase() yang ditunjuk oleh iterator i.
  13. Cetak beberapa teks di konsol.
  14. Gunakan perulangan for untuk membuat variabel perulangan x. Variabel ini akan digunakan untuk mengulangi elemen daftar.
  15. Cetak nilai daftar di konsol. Ini terjadi setelah penghapusan.
  16. Akhir dari badan perulangan for.
  17. Program harus mengembalikan nilai setelah berhasil diselesaikan.
  18. Akhir dari isi fungsi main().

Pertanyaan Umum Demo Slot

std::vector menyimpan elemen dalam memori yang berdekatan dengan akses acak O(1), sedangkan std::list adalah daftar berantai ganda yang memberikan penyisipan atau penghapusan di mana saja dengan O(1). Pilih vector untuk pengindeksan, dan list untuk penyisipan tengah yang sering.

Tidak. std::list tidak memiliki operator akses acak, jadi list[2] tidak dapat dikompilasi. Anda mencapai elemen dengan melakukan iterasi dari begin() atau end() satu node pada satu waktu, yang membutuhkan waktu linear O(n) untuk posisi yang dalam.

std::list adalah daftar berantai ganda yang menelusuri kedua arah dan mendukung push_back. std::forward_list adalah daftar berantai tunggal yang hanya bergerak maju, menggunakan lebih sedikit memori per node, dan tidak menyediakan iterator size() atau reverse.

Panggil fungsi anggota my_list.sort(), yang berjalan dalam waktu sekitar N log N dan menjaga elemen yang sama tetap stabil. Algoritma std::sort tidak akan berfungsi karena membutuhkan iterator akses acak. Berikan std::greater ke sort() untuk urutan menurun.

Menyisipkan atau menghapus sebuah node membutuhkan waktu konstan O(1) setelah Anda menyimpan iterator ke posisi tersebut, karena hanya pointer tetangga yang berubah. Menemukan posisi tersebut terlebih dahulu melalui traversal masih membutuhkan waktu O(n).

Ya. std::list bukanlah set, jadi ia menyimpan nilai yang berulang secara bebas. Setiap push_back, push_front, atau insert menambahkan node baru terlepas dari konten yang sudah ada. Gunakan std::set ketika Anda perlu menolak elemen duplikat.

Ya. Kopilot GitHub Menulis deklarasi std::list, perulangan iterator, dan panggilan insert atau erase dari komentar singkat atau nama fungsi. Seringkali menyarankan std::vector ketika penyimpanan berurutan lebih sesuai untuk tugas tersebut.

Asisten pengkodean AI melengkapi kode kontainer STL secara otomatis, menandai penggunaan iterator yang salah, mengkonversi std::list ke std::vector, dan menjelaskan pertimbangan kompleksitas. Mereka mempercepat pembelajaran STL, meskipun setiap saran masih perlu ditinjau.

Ringkaslah postingan ini dengan: