{"id":27069373,"url":"https://github.com/deryaxacar/42-cpp_08","last_synced_at":"2025-04-05T21:31:26.294Z","repository":{"id":285979137,"uuid":"940806417","full_name":"deryaxacar/42-Cpp_08","owner":"deryaxacar","description":"This project includes three fundamental exercises focused on the use of the STL (Standard Template Library). The first part implements a generic easyfind function to search within STL containers, the second introduces a Span class to calculate the shortest and longest distances between numbers, and the third develops an it","archived":false,"fork":false,"pushed_at":"2025-04-03T16:39:44.000Z","size":48,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-03T17:34:48.614Z","etag":null,"topics":["42","42-cpp","42-cpp-module","42-cpp-modules","42-school","42born2code","42cursus","42projects","42school","cpp","cpp-module-08","cpp-modules","cpp-modules-1337","cpp08","stl-algorithms","stl-containers","vector"],"latest_commit_sha":null,"homepage":"https://github.com/deryaxacar/42-Cpp_08/tree/main","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/deryaxacar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-28T20:36:48.000Z","updated_at":"2025-04-03T16:39:48.000Z","dependencies_parsed_at":"2025-04-03T17:45:25.265Z","dependency_job_id":null,"html_url":"https://github.com/deryaxacar/42-Cpp_08","commit_stats":null,"previous_names":["deryaxacar/42-cpp_08"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deryaxacar%2F42-Cpp_08","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deryaxacar%2F42-Cpp_08/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deryaxacar%2F42-Cpp_08/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deryaxacar%2F42-Cpp_08/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deryaxacar","download_url":"https://codeload.github.com/deryaxacar/42-Cpp_08/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247405854,"owners_count":20933792,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["42","42-cpp","42-cpp-module","42-cpp-modules","42-school","42born2code","42cursus","42projects","42school","cpp","cpp-module-08","cpp-modules","cpp-modules-1337","cpp08","stl-algorithms","stl-containers","vector"],"created_at":"2025-04-05T21:31:25.800Z","updated_at":"2025-04-05T21:31:26.265Z","avatar_url":"https://github.com/deryaxacar.png","language":"C++","readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003eC++ Module 08\u003c/h1\u003e \u003cimg src=\"https://cdn-icons-png.flaticon.com/512/6132/6132222.png\" alt=\"C++ Logo\" width=\"65\"\u003e\u003c/br\u003e\u003c/br\u003e\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n  Bu proje, STL (Standard Template Library) kullanımı üzerine üç temel egzersiz içermektedir. İlk bölümde STL kapsayıcılarda arama yapan generic bir \u003ccode\u003eeasyfind\u003c/code\u003e fonksiyonu, ikinci bölümde sayılar arasındaki farkları hesaplayan \u003ccode\u003eSpan\u003c/code\u003e sınıfı, üçüncü bölümde ise iterator destekli \u003ccode\u003eMutantStack\u003c/code\u003e sınıfı geliştirilmiştir. Proje, C++’ta şablonlar, kapsayıcılar ve algoritmalara hakimiyeti artırmayı hedefler.\n\u003c/p\u003e\n\n\n\n### İçindekiler 📚\n  - [Ex00 - Easy find](#ex00---easy-find)\n    - [Container (kapsayıcı) Nedir?](#container-kapsayici-nedir)\n    - [Iterator (yineleyici) Nedir?](#iterator-yineleyici-nedir)\n    - [Vector Nedir?](#vector-nedir)\n  - [Ex01 - Span](#ex01---span)\n    - [Span Nedir?](#span-nedir)\n    - [Span ile İlgili Kavramlar](#span-ile-ilgili-kavramlar)\n    - [STL Fonksiyonları](#stl-fonksiyonlari-stdsort-stddistance)\n    - [Performanslı Yaklaşım](#performansli-yaklasim)\n    - [addRange Fonksiyonu](#addrange-fonksiyonu)\n  - [Ex02 - Mutated Abomination](#ex02---mutated-abomination)\n    - [Stack Nedir?](#stack-nedir)\n    - [std::stack ve Iterator Sorunu](#stdstack-ve-iterator-sorunu)\n    - [MutantStack Nedir?](#mutantstack-nedir)\n    - [deque ve container_type](#deque-ve-container_type)\n    - [Avantajlar](#avantajlar)\n\n---\n\n### \u003ca name=\"ex00---easy-find\"\u003e\u003c/a\u003eEx00 - Easy find\n\n### \u003ca name=\"container-kapsayici-nedir\"\u003e\u003c/a\u003eContainer (kapsayıcı) Nedir?\n\n**Container**, belirli bir türdeki verileri belirli bir bellek düzeninde tutan yapılardır. C++ dilindeki Standart Kütüphane’de (STL — Standard Template Library), sıkça kullanılan birçok container çeşidi vardır (örneğin, `vector`, `list`, `deque`, `map`, `set` vb.). Kapsayıcılar şu işlevleri gerçekleştirir:\n\n- Verileri bellek üzerinde saklarlar.\n- Sakladıkları verilere erişimi belirli kurallar çerçevesinde düzenlerler (örneğin, dizi gibi sıralı erişim veya harita gibi anahtar-değer erişimi).\n- Eleman ekleme, silme ve sıralama gibi temel işlemleri kolay ve performanslı şekilde sunarlar.\n\nKapsayıcıların avantajları şunlardır:\n\n1. **Güvenlik**: Ham pointer veya ham bellek yönetimi yerine kapsayıcılar kullanmak, veri yönetimini kolaylaştırır ve hata yapma olasılığını azaltır.  \n2. **Verimlilik**: Standart Kütüphane’deki kapsayıcılar çoğu kullanım senaryosu için optimize edilmiştir.  \n3. **Kolaylık**: Aynı kapsayıcı yapısı farklı veri türlerinde kullanılabilir (templateler aracılığıyla).\n\n---\n\n### \u003ca name=\"iterator-yineleyici-nedir\"\u003e\u003c/a\u003eIterator (yineleyici) Nedir?\n\n**Iterator (yineleyici)**, kapsayıcılardaki veriler arasında gezinmeyi ve onlara erişimi sağlayan bir yapıdır. Genellikle, C++’ta dizilerde veya STL kapsayıcılarında kullanılabilen `pointer` benzeri nesnelerdir. Örneğin:\n\n- Bir `vector\u003cint\u003e` üzerinden yineleyici (iterator) kullanarak elemanları sırasıyla okuyabilir veya değiştirebilirsiniz.\n- İteratörler, C++ algoritmalarının (örn. `std::sort`, `std::find`) kapsayıcılarla birlikte sorunsuz çalışmasını sağlar.\n\nİteratörlerin bazı önemli noktaları:\n\n1. **Abstraction (Soyutlama)**: Gerçek bellek adresi ile uğraşmadan elemanlara erişim sağlanır.  \n2. **Taşınabilirlik**: Aynı kodu, farklı kapsayıcı tiplerinde yineleyicilerle kullanabilirsiniz.  \n3. **Çeşitlilik**: C++’ta birden çok iterator kategorisi vardır (örneğin, `input_iterator`, `forward_iterator`, `bidirectional_iterator`, `random_access_iterator` gibi). Bu kategoriler, hangi operasyonları destekleyebileceklerini belirler.\n\n---\n\n### \u003ca name=\"vector-nedir\"\u003e\u003c/a\u003eVector Nedir?\n\n**Vector**, C++ dilinde en sık kullanılan kapsayıcılardan biridir. Dinamik boyutlu bir dizi (array) gibi davranır; yani bellek alanı yetmediğinde kendine ayrılan alanı otomatik olarak genişletir. Başlıca özellikleri:\n\n1. **Sıralı (Sequential) Erişim**: Elemanlar bellek içinde arka arkaya saklanır, bu da rastgele erişim (`random access`) işlemlerini çok hızlı hale getirir (`O(1)` zaman karmaşıklığı).  \n2. **Dinamik Boyut Değiştirme**: `push_back()` ile vektörün sonuna eleman ekleyebilir, `pop_back()` ile son elemanı silebilirsiniz. Boyutu esnek bir şekilde artıp azalır.  \n3. **İteratör Kullanımı**: `begin()`, `end()`, `rbegin()`, `rend()` gibi fonksiyonlar ile vektör içindeki elemanlar üzerinde dolaşmak için yineleyiciler (iterator) alınabilir.  \n4. **Avantaj / Dezavantaj**:\n    - **Avantaj**: Rastgele erişimin (örn. `v[5]`) çok hızlı olması, ekleme/çıkarma işlemlerinin (özellikle sondan ekleme/çıkarma) pratik olması.  \n    - **Dezavantaj**: Ortalardan ekleme veya silme yapıldığında elemanların kaydırılması gerektiği için bu işlemlerin maliyeti artar.\n\n**Örnek**\n\n```cpp\n#include \u003ciostream\u003e\n#include \u003cvector\u003e\n\nint main() {\n    std::vector\u003cint\u003e numbers; // Boş bir vector\n\n    // Eleman ekleme\n    numbers.push_back(10);\n    numbers.push_back(20);\n    numbers.push_back(30);\n\n    // İteratör ile okuma\n    for (auto it = numbers.begin(); it != numbers.end(); ++it) {\n        std::cout \u003c\u003c *it \u003c\u003c \" \";\n    }\n    // Çıktı: 10 20 30\n\n    return 0;\n}\n\n```\n\n---\n\n### \u003ca name=\"ex01---span\"\u003e\u003c/a\u003eEx01 - Span\n\n#### Span Nedir?\n\n**Span**, belli sayıda tamsayıyı saklayabilen bir kapsayıcı sınıftır ve bu tamsayılar arasındaki en kısa ve en uzun mesafeyi (span) hesaplamak amacıyla kullanılır.\n\n---\n\n### \u003ca name=\"span-ile-ilgili-kavramlar\"\u003e\u003c/a\u003eSpan ile İlgili Kavramlar\n\n#### Sayılar Arasındaki Mesafe (Span)\n\nİki tamsayı arasındaki mesafe, mutlak farkları ile hesaplanır:\n\n- Örnek: `|3 - 9| = 6`\n\n**Shortest Span**, birbiri ardına gelen iki sayı arasındaki en küçük farktır.\n\n**Longest Span**, en küçük ve en büyük sayı arasındaki farktır.\n\n---\n\n### \u003ca name=\"stl-fonksiyonlari-stdsort-stddistance\"\u003e\u003c/a\u003eSTL Fonksiyonları (std::sort, std::distance)\n\n- `std::sort`: Vektörü sıralamak için kullanılır, çünkü shortest span hesaplamak için sıralama gerekir.\n\n  ```cpp\n  std::sort(vec.begin(), vec.end());\n   ```\n- `std::distance`: İki iterator arasındaki eleman sayısını verir. Span hesaplamasında dolaylı kullanılır.\n\n### \u003ca name=\"performansli-yaklasim\"\u003e\u003c/a\u003ePerformanslı Yaklaşım\n\n- Kısa span: Vektörü sırala, ardından ardışık farkların minimumunu bul.\n- Uzun span: Min ve max değerlerin farkını al.\n\n#### addRange() Fonksiyonu\n\n`std::vector`, `std::list`, `std::set` gibi kapsayıcılardan Span nesnesine toplu şekilde eleman eklemek için iterator aralığı alan bir `addRange()` fonksiyonu yazılmalıdır:\n\n```cpp\ntemplate \u003ctypename Iterator\u003e\nvoid addRange(Iterator begin, Iterator end);\n```\n\n---\n\n### \u003ca name=\"ex02---mutated-abomination\"\u003e\u003c/a\u003eEx02 - Mutated Abomination\n\n#### Stack Nedir?\n\n**Stack**, LIFO (Last-In First-Out) mantığıyla çalışan bir veri yapısıdır. `std::stack`, `push`, `pop`, `top`, `empty`, `size` gibi temel işlemleri destekler. Ancak STL’de `std::stack` iterable değildir.\n\n---\n\n#### std::stack ve Iterator Sorunu\n\n`std::stack`, iterator desteklemez çünkü `begin()` ve `end()` metodları yoktur. Bu, `for` döngüsü ile gezinmeyi imkansız hale getirir. Örneğin:\n\n```cpp\nstd::stack\u003cint\u003e s;\n// s.begin() -\u003e derleme hatası\n```\n\n#### MutantStack Nedir?\n\nMutantStack, `std::stack`’i kalıtım yoluyla genişletip iterator desteği ekleyen özel bir sınıftır. Böylece stack içeriği üzerinde `begin()` / `end()` kullanarak gezinmek mümkün hale gelir.\n\n```cpp\ntemplate\u003ctypename T\u003e\nclass MutantStack : public std::stack\u003cT\u003e {\npublic:\n    typedef typename std::stack\u003cT\u003e::container_type::iterator iterator;\n\n    iterator begin() { return this-\u003ec.begin(); }\n    iterator end()   { return this-\u003ec.end(); }\n};\n\n```\n\n#### deque ve container_type\n\n`std::stack`, aslında `std::deque`'i temel alır. `container_type`, `stack`’in kullandığı bu yapıya erişmeyi sağlar. Bu sayede `stack`’in elemanlarına direkt olarak iterator ile ulaşabiliriz.\n\n```cpp\nint main() {\n    MutantStack\u003cint\u003e mstack;\n\n    mstack.push(5);\n    mstack.push(17);\n    std::cout \u003c\u003c mstack.top() \u003c\u003c std::endl;\n    mstack.pop();\n    std::cout \u003c\u003c mstack.size() \u003c\u003c std::endl;\n\n    mstack.push(3);\n    mstack.push(5);\n    mstack.push(737);\n    mstack.push(0);\n\n    MutantStack\u003cint\u003e::iterator it = mstack.begin();\n    MutantStack\u003cint\u003e::iterator ite = mstack.end();\n\n    while (it != ite) {\n        std::cout \u003c\u003c *it \u003c\u003c std::endl;\n        ++it;\n    }\n\n    return 0;\n}\n```\n\n#### Avantajlar\n\n- `std::stack`’in tüm özellikleri korunur.\n\n- Iterator desteği ile kolay `test`, `debug` ve `algoritma` işlemleri yapılabilir.\n\n- `std::list` ile aynı çıktıyı verecek şekilde test edilebilir.\n\n---\n\n\u003cp align=\"center\"\u003e2025 This project was created by Derya ACAR.\u003c/p\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fderyaxacar%2F42-cpp_08","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fderyaxacar%2F42-cpp_08","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fderyaxacar%2F42-cpp_08/lists"}