std::liste girişi C++ Örnek ile

⚡ Akıllı Özet

std::liste girişi C++ Çift yönlü bağlantılı liste olarak uygulanan bir sıralı kapsayıcıdır; elemanları bitişik olmayan bellekte saklarken herhangi bir konumda hızlı ekleme ve silme imkanı sağlar ve rastgele erişim yerine çift yönlü sıralı erişimi destekler.

  • 🔗 Çift yönlü bağlantılı liste: Her öğe, kendisinden önceki ve sonraki düğüme bağlantılar içerir; bu nedenle std::list verileri, birbirine bitişik olmayan bellek alanlarında bulunur.
  • ⚡ Hızlı ekleme ve silme: Bilinen bir konuma eleman eklemek veya çıkarmak, elemanları kaydıran bir vektörün aksine, sabit zaman alır.
  • ???? Rastgele erişim yok: Öğelere her iki uçtan da ardışık geçişle ulaşılır, bu nedenle list[3] gibi indeksleme kullanılamaz.
  • 🧩 Yapıcılar: Default, fill, range, copy, move ve initializer-list yapıcıları, std::list'i farklı şekillerde oluşturur.
  • ️ Üye fonksiyonları: push_front(), push_back(), insert(), erase(), size(), reverse() ve merge() fonksiyonları listenin içeriğini yönetir.
  • 🤖 Yapay zeka yardımı: GitHub Copilot ve benzeri yardımcı araçlar, kısa bir yorumdan std::list bildirimlerini, yineleyicileri ve ekleme veya silme mantığını oluşturur.

std::liste girişi C++

Std::liste nedir?

In C++`std::list`, bir depolama kabını ifade eder. `std::list`, herhangi bir yerden öğe eklemenize ve çıkarmanıza olanak tanır. `std::list`, çift yönlü bağlantılı bir liste olarak uygulanmıştır. Bu, liste verilerine çift yönlü ve sıralı olarak erişilebileceği anlamına gelir.

Standart Şablon Kütüphanesi listesi hızlı rastgele erişimi desteklemez, ancak her yönden sıralı erişimi destekler.

Liste öğelerini farklı bellek parçalarına dağıtabilirsiniz. Verilere sıralı erişim için gereken bilgiler bir kapta saklanır. std::list çalışma zamanı sırasında gerektiği gibi her iki uçtan da genişleyebilir ve daralabilir. Dahili bir ayırıcı, depolama gereksinimlerini otomatik olarak karşılar.

Bu özellikler pratik bir soruyu gündeme getiriyor: Gerçekten ne zaman bir listeye başvurmalısınız?

Neden std::list kullanıyorsunuz?

İşte std::list kullanmanın nedenleri:

  • `std::list`, `array` ve `vector` gibi diğer sıralı veri yapılarına kıyasla daha iyi performans gösterir.
  • Yerleştirme, taşıma ve çıkarma işlemlerinde daha iyi performans sergiliyorlar.tracHerhangi bir konumdan öğeleri yerleştirme.
  • Std::list, bu tür işlemleri yoğun bir şekilde gerçekleştiren algoritmalarla da daha iyi sonuç verir.

Sebepler açık olduğuna göre, bir sonraki adım bunu belirten sözdizimidir.

Liste Söz Dizimi

Std::list'i tanımlamak için, içe aktarmamız gerekir. başlık dosyası. İşte std::list tanımı sözdizimi:

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

Yukarıdaki parametrelerin açıklaması aşağıda verilmiştir:

  • T – İçerdiği öğenin türünü tanımlar. T yerine herhangi bir veri türü, hatta kullanıcı tanımlı türler bile kullanabilirsiniz.
  • Alloc – Ayırıcı nesnesinin türünü tanımlar. Varsayılan olarak ayırıcı sınıf şablonunu kullanır. Değere bağlıdır ve basit bir bellek tahsis modeli kullanır.

Örnek 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';
	}
}

Çıktı:

std::list oluşturma ve yineleme örneğinin çıktısı

İşte kodun ekran görüntüsü:

C++ std::list oluşturan ve for döngüsü kullanarak yazdıran kod.

Code Açıklama:

  1. İşlevlerini kullanmak için algoritma başlık dosyasını ekleyin.
  2. İşlevlerini kullanmak için iostream başlık dosyasını ekleyin.
  3. İşlevlerini kullanmak için liste başlığı dosyasını ekleyin.
  4. main() fonksiyonunu çağırın. Program mantığı bu fonksiyonun gövdesine eklenmelidir.
  5. 4 tam sayıdan oluşan my_list adlı bir liste oluşturun.
  6. Kullanmak döngü için Bir döngü değişkeni x oluşturun. Bu değişken, liste öğeleri üzerinde yineleme yapmak için kullanılacaktır.
  7. Listenin değerlerini konsola yazdırın.
  8. For döngüsünün gövdesinin sonu.
  9. Main() işlevinin gövdesinin sonu.

C++ Liste Fonksiyonları

Yaygın std::list işlevleri şunlardır:

İşlev Açıklama
ekle () Bu işlev yineleyicinin işaret ettiği konumdan önce yeni bir öğe ekler.
Geri itmek() Bu işlevler listenin sonuna yeni bir öğe ekler.
push_front() Listenin önüne yeni bir öğe ekler.
pop_front() Listenin ilk öğesini siler.
boyut() Bu fonksiyon liste elemanlarının sayısını belirler.
ön() Listenin ilk öğelerini belirlemek için.
geri() Listenin son öğesini belirlemek için.
tersine çevirmek() Liste öğelerini tersine çevirir.
birleştirmek() İki sıralı listeyi birleştirir.

İnşaatçılar

Listesi fonksiyonlar tarafından sağlanan başlık dosyası:

  • Varsayılan kurucu std::list::list()- Sıfır elemanlı boş bir liste oluşturur.
  • Doldurma yapıcısı std::list::list()- N öğeli bir liste oluşturur ve her öğeye sıfır (0) değeri atar.
  • Aralık yapıcısı std::list::list()- ilkten sonuncuya kadar birçok öğe içeren bir liste oluşturur.
  • Kopyalama yapıcısı std::list::list()- Mevcut listede bulunan her öğenin bir kopyasını içeren bir liste oluşturur.
  • Taşıma yapıcısı std::list::list()- taşıma semantiğini kullanarak başka bir listenin öğelerini içeren bir liste oluşturur.
  • Başlatıcı listesi yapıcısı std::list::list()-Taşıma semantiğini kullanarak başka bir listenin öğelerini içeren bir liste oluşturur.

Örnek 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;
}

Çıktı:

std::list yapıcılarının örnek çıktısı

İşte kodun ekran görüntüsü:

C++ std::list'in default, range ve move yapıcı fonksiyonlarını gösteren kod.

Code Açıklama:

  1. İşlevlerini kullanmak için iostream başlık dosyasını ekleyin.
  2. İşlevlerini kullanmak için liste başlığı dosyasını ekleyin.
  3. Sınıflarını çağırmadan kullanmak için std ad alanını koda ekleyin.
  4. main() fonksiyonunu çağırın. Program mantığı bu fonksiyonun gövdesine eklenmelidir.
  5. L adında boş bir liste oluşturun.
  6. 1 tam sayıdan oluşan l3 adında bir liste oluşturun.
  7. L2 adlı listedeki tüm öğelerin başından sonuna kadar l1 adında bir liste oluşturun.
  8. Taşıma anlambilimini kullanarak l3 adında bir liste oluşturun. l3 listesi l2 listesiyle aynı içeriğe sahip olacaktır.
  9. Konsoldaki l isimli listenin boyutunu diğer metinlerin yanında yazdırın.
  10. Konsola bir miktar metin yazdırın.
  11. Adında bir yineleyici oluşturun ve onu, l2 adlı listenin öğeleri üzerinde yineleme yapmak için kullanın.
  12. L2 isimli listenin elemanlarını konsola yazdırın.
  13. Konsola bir miktar metin yazdırın.
  14. Adında bir yineleyici oluşturun ve onu, l3 adlı listenin öğeleri üzerinde yineleme yapmak için kullanın.
  15. L3 isimli listenin elemanlarını konsola yazdırın.
  16. Program başarılı bir şekilde tamamlandıktan sonra değeri döndürmelidir.
  17. Main() işlevinin gövdesinin sonu.

Konteyner özellikleri

Konteyner özelliklerinin listesi aşağıdadır:

Varlığınızı Açıklama
Dizi Sıra kapları, elemanlarını katı bir doğrusal sırayla sıralar. Öğelere dizideki konumlarına göre erişilir.
Çift bağlantılı liste Her öğenin önceki ve sonraki öğelerin yerinin nasıl belirleneceğine ilişkin bilgisi vardır. Bu, ekleme ve silme işlemleri için sabit süreye izin verir.
Ayırıcıyı tanıyan Depolama boyutunu dinamik olarak değiştirmek için bir ayırıcı nesnesi kullanılır.

Listeye Ekleme

Bir listeye değer eklemek için kullanabileceğimiz farklı fonksiyonlar vardır. Bunu şu şekilde gösterelim:

Örnek 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';
	}
}

Çıktı:

std::list'e eleman ekledikten sonraki çıktı

İşte kodun ekran görüntüsü:

C++ std::list üzerinde push_front, push_back ve insert fonksiyonlarını kullanan kod.

Code Açıklama:

  1. İşlevlerini kullanmak için algoritma başlık dosyasını ekleyin.
  2. İşlevlerini kullanmak için iostream başlık dosyasını ekleyin.
  3. İşlevlerini kullanmak için liste başlığı dosyasını ekleyin.
  4. main() fonksiyonunu çağırın. Program mantığı bu fonksiyonun gövdesine eklenmelidir.
  5. 4 tam sayıdan oluşan my_list adlı bir liste oluşturun.
  6. 11. öğeyi my_list adlı listenin önüne ekleyin.
  7. 18. öğeyi my_list adlı listenin sonuna ekleyin.
  8. Bir yineleyici oluşturun ve bunu my_list listesinden 10. öğeyi bulmak için kullanın.
  9. Yukarıdaki öğenin bulunup bulunmadığını belirlemek için if ifadesini kullanın.
  10. Eğer bulunursa, 21. elemanı yukarıdaki elemanın önüne ekleyin.
  11. If ifadesinin gövdesinin sonu.
  12. Bir x döngü değişkeni oluşturmak için for döngüsünü kullanın. Bu değişken liste öğeleri üzerinde yineleme yapmak için kullanılacaktır.
  13. Listenin değerlerini konsola yazdırın.
  14. For döngüsünün gövdesinin sonu.
  15. Main() işlevinin gövdesinin sonu.

Bir listeye eklenen öğeler, aynı kolaylıkla listeden de çıkarılabilir.

Listeden Silme

Bir listeden öğeleri silmek mümkündür. erase() fonksiyonu, bir listeden bir öğeyi veya bir öğe aralığını silmenizi sağlar.

  • Tek bir öğeyi silmek için bir tam sayı konumunu iletmeniz yeterlidir. Öğe silinecek.
  • Bir aralığı silmek için başlangıç ​​ve bitiş yineleyicilerini geçirmeniz gerekir. Bunu gösterelim.

Örnek 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;
}

Çıktı:

std::list'ten bir öğe silindikten sonraki çıktı

İşte kodun ekran görüntüsü:

C++ std::list üzerinde erase fonksiyonunu kullanan kod

Code Açıklama:

  1. İşlevlerini kullanmak için algoritma başlık dosyasını ekleyin.
  2. İşlevlerini kullanmak için iostream başlık dosyasını ekleyin.
  3. İşlevlerini kullanmak için liste başlığı dosyasını ekleyin.
  4. Sınıflarını çağırmadan kullanmak için programımıza std ad alanını ekleyin.
  5. main() fonksiyonunu çağırın. Program mantığı bu fonksiyonun gövdesine eklenmelidir.
  6. 4 tam sayıdan oluşan my_list adlı bir liste oluşturun.
  7. Konsola bir miktar metin yazdırın.
  8. Bir x döngü değişkeni oluşturmak için for döngüsünü kullanın. Bu değişken liste öğeleri üzerinde yineleme yapmak için kullanılacaktır.
  9. Listenin değerlerini konsola yazdırın.
  10. For döngüsünün gövdesinin sonu.
  11. Listenin ilk öğesine işaret eden bir yineleyici i oluşturun.
  12. Yineleyici i tarafından işaret edilen delete() işlevini kullanın.
  13. Konsola bir miktar metin yazdırın.
  14. Bir x döngü değişkeni oluşturmak için for döngüsünü kullanın. Bu değişken liste öğeleri üzerinde yineleme yapmak için kullanılacaktır.
  15. Listenin değerlerini konsola yazdırın. Bu, silme işleminden sonra gelir.
  16. For döngüsünün gövdesinin sonu.
  17. Program başarılı bir şekilde tamamlandığında bir değer döndürmelidir.
  18. Main() işlevinin gövdesinin sonu.

SSS

`std::vector`, O(1) rastgele erişimle bitişik bellekte eleman depolarken, `std::list` ise herhangi bir yere ekleme veya silme işlemi için O(1) karmaşıklığı sağlayan çift yönlü bağlantılı bir listedir. İndeksleme için `vector`, sık sık orta kısma eklemeler için ise `list` tercih edilir.

Hayır. std::list'in rastgele erişim operatörü yok, bu yüzden list[2] derlenmiyor. Bir elemana, begin() veya end()'den başlayarak birer birer düğümleri yineleyerek ulaşıyorsunuz; bu da derin bir konum için doğrusal O(n) zaman maliyetine neden oluyor.

`std::list`, her iki yönde de hareket eden ve `push_back` özelliğini destekleyen çift yönlü bağlantılı bir listedir. `std::forward_list` ise yalnızca ileriye doğru hareket eden, düğüm başına daha az bellek kullanan ve `size()` veya ters yineleyici sağlamayan tek yönlü bağlantılı bir listedir.

Yaklaşık N log N sürede çalışan ve eşit elemanları sabit tutan `my_list.sort()` üye fonksiyonunu çağırın. `std::sort` algoritması rastgele erişim yineleyicilerine ihtiyaç duyduğu için çalışmayacaktır. Azalan sıralama için `std::greater` değerini `sort()` fonksiyonuna geçirin.

Bir düğümü eklemek veya silmek, konuma bir yineleyici tuttuğunuz anda sabit O(1) zaman alır, çünkü yalnızca komşu işaretçiler değişir. Bu konumu önce dolaşarak bulmak yine de O(n) zaman maliyetine sahiptir.

Evet. `std::list` bir küme değildir, bu nedenle tekrarlanan değerleri serbestçe saklar. Her `push_back`, `push_front` veya `insert` işlemi, mevcut içeriğe bakılmaksızın yeni bir düğüm ekler. Yinelenen öğeleri reddetmeniz gerektiğinde `std::set` kullanın.

Evet. GitHub Yardımcı Pilotu Kısa bir yorum veya fonksiyon adından `std::list` bildirimlerini, yineleyici döngülerini ve ekleme veya silme çağrılarını yazar. Genellikle, bitişik depolama göreve daha uygun olduğunda `std::vector` önerir.

Yapay zekâ kodlama asistanları, STL konteyner kodunu otomatik olarak tamamlar, yanlış yineleyici kullanımını işaretler, std::list'i std::vector'a dönüştürür ve karmaşıklık dengelerini açıklar. STL öğrenimini hızlandırırlar, ancak her önerinin yine de gözden geçirilmesi gerekir.

Bu yazıyı şu şekilde özetleyin: