![]() Daha iyi ve mutlu bir yaşam için 21 tane sağlıklı öneri. Ücretsiz Ekitap. | ![]() |
|
| |||||||
![]() |
| | Seçenekler |
|
#1
| |||||
| |||||
C ++ Stl KullanimiStandart Template Kütüphanesi(STL) STL ilk kez HP şirketi programcıları tarafından geliştirilmiş ve kullanılmıştır. 1996’da C++’ın standardizasyon taslaklarında STL C++’ın standart kütüphanesi olarak kabul edilmiştir. STL tamamen template sınıflar ve fonksiyonlardan oluşan geniş bir kütüphanedir. STL kullanabilmek için ilgili fonksiyonun ya da sınıfın bulunduğu başlık dosyası include edilmelidir. STL fonksiyonları ve sınıfları guruplandırılarak çeşitli başlık dosyalarının içerisine yerleştirilmiştir. Eskiden STL sınıflarınınn ve fonksisyonlarını bulunduğu başlık dosyasının uzantısı *.h biçimindeydi. 1996 ve sonrasında bu uygulamaya son verilmiştir. Şimdi STL Kütüphanesi uzantısı olmayan dosyaların içerisindedir. Örneğin eskiden bağlı liste sınıfı list.h içerisindeydi, şimdi yalnızca list dosyası içerisindedir. Bugünkü derleyicilerin çoğu hem *.h uzantılı dosyaları hem de uzantısız dosyaları bulundurmaktadır, dolayısıyla eskiden yazılmış kodlar problemsiz derlenmektedir. Tabii derleyicilerin standardizasyon öncesi dönemi desteklemesi zorunlu değildir. Tüm STL kodları bu dosyalar içerisinde olduğu için nasıl yazıldıkları kolaylıkla incelenebilir. STL kütüphansei üç tür elemandan oluşur: Algoritmalar: STL içerisindeki global template fonksiyonlara algoritma denilmektedir. Bu fonksiyonlar özellikle bazı operatörler kullanılarak yazılmıştır, bu yüzden diğer template sınıflar ile birlikte kullanılabilir. Nesne tutan sınıflar (container classes): İçerisinde birden fazla nesnenin tutulduğu, çeşitli veri yapılarının uygulandığı sınıflara nesne tutan sınıflar denir (Container class nesne yönelimli terminolojide genel bir terimdir. Container class terimi ile collection terimi eş anlamlı olarak kullanılmaktadır). Örneğin dizileri temsil eden sınıflar, kuyruk sınıfları, bağlı liste sınıfları tipik birer nesne tutan sınıftır. STL içerisinde bazı nesne tutan sınıflar başka nesne tutan sınıflardan faydalanılarak yazılmıştır. Örneğin, stack sınıfı deqeue sınıfı kullanılarak yazılmıştır. Böylecene bu tür sınıflara adaptör sınıflar (STL adaptors) denilmektedir. Yararlı sınıflar (utility classes): Nesne tutma amacında olmayan genel sınıflardır. Nesne yönelimli programlama tekniğindeki en büyük gelişmelerden biri veri yapılarının standart bir biçimde sınıflarla temsil edilmesidir. Örneğin STL sayesinde programcının gereksinim duyacağı neredeyse algoritmik herşey standart olarak yazılmıştır. STL içerisinde olmayan veri yapıları ve algoritmalar STL kullanılarak programcılar tarafından yazılabilir. Her programcının aynı biçimdeki veri yapıları ve algoritmalar üzerinde çalışması kodların anlaşılmasını kolaylaştırmaktadır. STL içerisinde tüm temel algoritmalarının veri yapılarının bulunması işleri kolaylaştırmakla birlikte bütün problemleri kendi başına çözmemektedir. Pogramcının algoritmalar ve veri yapıları arasındaki farkları bilmesi, duruma göre bunlardan birini seçmesi gerekir. Hangi veri yapısının ve algoritmanın kullanılacağı yine belli düzeyde bir bilgi gerektirmektedir. STL sınıflarının tasarımında çokbiçimlilik (polymorphism) performansı düşürür gerekçesiyle kullanılmamıştır. Yani sınıflar bir türetme ilişkisi içerisinde değil, bağımsız bir biçimde bulunur. Ancak programcı isterse STL sınıflarından türetme yapabilir. Yine STL sınıflarında iostream sistemi dışında türetme kullanılmamıştır. Exception handling mekanizması çok az düzeyde kullanılmıştır. 4.7 STL string Sınıfı C++’ın standart kütüphanesinde yazı işlerini kolaylaştırmak için kullanılan bir string sınıfı vardır. STL tamamen template tabanlı bir kütüphanedir, yani bütün global fonksiyonlar template fonksiyonlar, bütün sınıflar da template sınıflardır. İşte aslında string sınıfı basic_string template sınıfından yapılmış bir typedef ismidir. string ismi aşağıdaki gibi typedef edilmiştir: typedef basic_string<char> string; Yani yazı işlemleri için asıl template sınıf basic_string template sınıfıdır, string ismi bu sınıfın char türü için açılmış halidir. basic_string template sınıfı “string” dosyası içerisindedir (dosyanın *.h biçiminde uzantısı yoktur). basic_string sınıfı üç template parametresi içeren genel bir sınıftır. template <class E, class T = char_traits<E>, class A = allocator<E> > class basic_string { //... }; Birinci template parametresinin verilmesi zorunludur, bu tür yazının her bir karakterinin hangi türden olduğunu anlatır. Örneğin ASCII yazıların her bir karakteri 1 byte’dır ve tipik olarak char türüyle temsil edilir, ancak UNICODE yazılarda her bir karakter 2 byte yer kaplar ve wchar_t ile temsil edilir. Bu durumda bir ASCII yazıyı tutmak için nesne basic_string<char> x; biçiminde tanımlanır, UNICODE yazıyı tutmak için nesne basic_string<wchar_t> x; biçiminde tanımlanır. Genellikle ASCII yazılar yoğun olarak kullanıldığından işlemi kolaylaştırmak için string typedef ismi bildirilmiştir. Yani, basic_string<char> str; ile string str; aynı anlamdadır. basic_string sınıfının ikinci template parametresi default olarak char_traits sınıfı türündendir. char_traits bir STL sınıfıdır ve iki karakteri karşılaştıran static üye fonksiyonları vardır. basic_string sınıfının karşılaştırma fonksiyonları bu sınıftaki static fonksiyonlar çağırılarak yazılmıştır. Örneğin, basic_string sınıfının < operatör fonksiyonu, ikinci template parametresiyle belirtilen sınıfın lt() ve eq() static fonksiyonlarını çağırarak yazılmış olsun, template <class E, class T = char_traits<E>, class A = allocator<E> > bool basic_string<E, T, A>: perator <(const E *pStr){ for (int i = 0; i < SIZE; i++) { if (T::lt(m_pBuf[i], pStr[i])) return true; if (!T::eq(m_pBuf[i], pStr[i])) return false; } return false; } char_trait sınıfının iki karakteri karşılaştıran üye fonksiyonları ASCII karakter tablosunu temel alarak işlemlerini yapmaktadır. Biz örneğin karşılaştırma işlemlerinin Türkçe yapılmasını istersek char_trait sınıfının elemanlarını başka bir sınıf adı altında ama Türkçe’ye uygun bir biçimde yazmalıyız, böylece basic_string sınıfına hiç dokunmadan onun işlevini değiştirmiş oluruz. Örneğin bu sınıfın ismi trk_traits olsun. typedef std::basic_string<char, trk_traits> trkstring; trkstring a(“ılgaz”); trkstring b(“ismail”); if (a < b) { //... } basic_string sınıfının üçüncü template parametresi default olarak allocator türündendir. Neredeyse tüm STL template sınıfları böyle bir allocator template parametresi almaktadır. Aslında STL içerisinde dinamik tahsisatlar doğrudan new operatörüyle yapılmamıştır, template argümanı olarak belirtilen sınıfın static üye fonksiyonu çağırılarak yapılmıştır. allocator bir STL sınıfıdır ve default olarak bu sınıfın tahsisat yapan fonksiyonu new operatörünü kullanmaktadır. Programcı başka isimde yeni bir tahsisat sınıfı yazabilir ve böylece tüm STL sınıfları o sınıfın tahsisat fonksiyonunu çağıracak duruma gelir. Tahsisat sınıfının kullanım ve anlamı ileride ele alınacaktır. 4.7.1 Basic_string Sınıfının Üye Fonksiyonları Başlangıç Fonksiyonları: Sınıfın daha önce yazmış olduğumuz CString sınıfına benzer parametre yapıları içeren şu başlangıç fonksiyonları vardır: basic_string(); Default başlangıç fonksiyonudur. basic_string(const basic_string &str); Kopya başlangıç fonksiyonudur. basic_string(const basic_string &str, size_type pos, size_type n); size_type, basic_string sınıfı içerisinde bildirilmiş bir typedef ismidir. Bu typedef default olarak size_t türündendir. Bu başlangıç fonksiyonu başka bir basic_string nesnesinin belirli bir karakterinden başlayarak n tane karakteri alıp nesneyi oluşturur. Örneğin: string a(“ankara”); string b(a, 2, 4); // b = kara basic_string(const E *str, size_type n); Adresiyle verilmiş bir yazının ilk n karakterinden nesne oluşturur. Örneğin: string a(“ankara”, 3); // a = ank basic_string(const E *str); Parametresiyle belirtilen adresten ‘\0’ görene kadarki kısımdan yazıyı oluşturur. En çok kullanılan constructor’dur. Örneğin: string a(“ankara”); basic_string(size_type n, E ch); Aynı karakterden n tane olan bir nesne oluşturur. Örneğin: string a(4, ‘a’); string b(“aaaa”); assert(a == b); basic_string(const iterator first, const iterator last); İki iterator arasından nesne oluşturur (iterator konusu STL’in en önemli kavramlarından biridir, ileride ele alınacaktır). Atama Operatör Fonksiyonları: Bilindiği gibi atama operatör fonksiyonları string sınıfı için yazının tutulduğu eski alanı boşaltıp yeni yazı için yeni bir alan tahsis etme eğilimindedir. basic_string &operator =(const basic_string &str); İki basic_string nesnesinin atanmasında kullanılır. Örneğin: string a(“ankara”); string b = “istanbul”; b = a; assert(a == b); basic_string &operator =(const E *str); Adresiyle verilmiş olan bir yazıyı atamakta kullanılır. Örneğin: string a(“ankara”); a = “istanbul”; basic_string &operator =(E ch); Nesnenin tek bir karakterden oluşan yazıyı tutmasını sağlar. Örneğin: string a; a = ‘x’; Atama operatör fonksiyonlarının hepsinin geri dönüş değeri sol taraftaki nesnenin kendisidir, yani aşağıdaki işlem geçerlidir: string a(“ankara”), b, c; c = b = a; Anahtar Notlar: ostream türünden cout nesnesi 1996 ve sonrasında string türünü de yazdıracak operatör fonksiyonuna sahip olmuştur. 1996 ve sonrasında başlık dosyalarının uzantısı kaldırıldığından ancak eski pek çok derleyici *.h uzantılı eski sistemi de desteklediğinden bir karmaşa doğabilir. Şöyle ki, biz iostream. h dosyasını include edersek eski iostream kütüphanesini kullanıyor duruma düşeriz, bu durumda cout ile string türünü yazdıramayız. cout ile string türünü yazdırabilmek için uzantısı olmayan iostream dosyasının include edilmesi gerekir. |
| Sponsorlar | |||
|
![]() |
| Seçenekler | |
| |
Benzer Konular | ||||
| Konu | Konu Açanlar | Forum | Cevaplar | Güncel Mesajlar |
| Programlamaya giriş dersleri ders -4- FORM KULLANIMI | Celebrian | Visual Basic & Action script | 5 | 24-12-2007 11:31 |
| Ini dosyalarinin kullanimi | Celebrian | Visual Basic & Action script | 0 | 24-12-2007 10:59 |
| Telnet Ile Çesitli Protokollerin Kullanimi | teknohaberci | Network-internet | 0 | 22-11-2007 04:39 |
| Resimlerde 'MAP' kullanimi | teknohaberci | Html | 0 | 09-11-2007 10:41 |
| Sayfalarda tablo kullanimi | teknohaberci | Html | 0 | 09-11-2007 10:40 |
| |