Herkese merhabalar arkadaşlar,
Bu yazım ile birlikte “Kod Parçası” serimize bir başlangıç yapıyoruz. Bundan sonra, bu tarz çok daha kısa, öz ve daha kolay sindirilebilecek 🙂 kod parçalarını, Haftalık C++ yazıları altında sizler ile paylaşıyor olacağım. Daha önce yazdığım değerlendirme yazımda da bahsettiğim gibi bu tarz kısa kod paylaşımlarını aslında uzun süredir yapmayı planlıyordum (ve düzenli hale getirme). Bu kod parçaları:
- ya çok bilinen bir problemi çözüyor olacak,
- ya yaygın olarak gerçekleştirilen bir kullanıma yönelik olacak,
- ya da C++ ile gelen yeni kabiliyetleri göstermeye yönelik olacak.
Bu yazıları “Snippet/Kod Parçası” olarak etiketleyeceğim ama halen Haftalık C++ serisi altında olacak.
İlk kod parçamız if-init, yapısal bağlama, ilklendirme listeleri ve auto kullanıma yönelik kombo bir kod parçası olacak 🙂
Bu arada bu konulara ilişkin daha detaylı bilgi almak için aşağıdaki yazılarıma muhakkak göz atınız lütfen 😉
Haftalık C++ 3 – if/switch init-statements
Haftalık C++ 4 – Yapısal Bağlama
Modern C++ (1): nullptr, enum sınıfları, range-based döngüler, auto
Modern C++ (3): Uniform Initialization, override/final, default/delete, constexpr, etc.
Yukarıdaki yazılarımı okuduysanız, bu kabiliyetlerin konteynerler ile kullanıma ilişkin örnekler de verdiğimi görürsünüz. Fakat aşağıdaki vereceğim kod parçası, özellikle std::map konteynerine veri ekleme de kullanabileceğiniz oldukça kullanışlı bir kod parçası. Bu konteynere veri eklemek için std::map::insert() API’sini kullanabilirsiniz, bu durumda ilgili API size bir std::pair döner. Bunun ilk elemanı ya yeni eklenen elemana (eğer daha önce konteynerde yok ise) ya da mevcut elemanı işaret eden bir iterator’dür. İkincisi ise ekleme işleminin başarılı bir şekilde olup/olmadığını ifade eden bir boolean değerdir. Bu API’nin detaylarına sayfasından‘ dan ulaşabilirsiniz. Şimdi, bu işin daha önce (modern C++’tan önce) ve şu an nasıl yapıldığına bakalım:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream> #include <map> #include <string> using namespace std; // Modern C++ öncesi int main() { map<string, int> mapInstance; mapInstance["hello"] = 1; mapInstance["world"] = 2; pair<map<string, int>::iterator, bool> ret; // Zaten var olan ve yeni bir eleman ekleyelim ret = mapInstance.insert ( pair<string, int>("hello", 500) ); if (ret.second == false) cout << "Element 'hello' already exists with value: " << ret.first->second << '\n'; ret = mapInstance.insert ( pair<string, int>("there", 500) ); if (ret.second == false) cout << "Element 'there' already exists with value: " << ret.first->second << '\n'; return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> #include <map> #include <string> using namespace std; // Modern C++ hali int main() { map<string, int> mapInstance = { {"hello", 1}, {"world", 2}}; // Zaten var olan ve yeni bir eleman ekleyelim if (auto [it, inserted] = mapInstance.insert({ "hello", 3 }); !inserted) cout << "Element 'hello' already exists with value: " << it->second << "\n"; if (auto [it, inserted] = mapInstance.insert({ "there", 4 }); !inserted) cout << "Element 'there' already exists with value: " << it->second << "\n"; return 0; } |
Benim şahsi kanaatim, ikinci, yani modern C++ kod parçası çok daha açık ve şık, bu sebeple size de bunu kullanmanızı önereceğim. Evet, hepsi bu kadar. Size kısa sürecek demiştim 🙂
Bu arada sırada son std::thread yazımın çevirisi var, sonrasında son bir std::thread yazımız ile o diziyi de bitirmeyi planlıyorum. Şu an ayrıca, Python kodu ile C++ uyumlu bir kod parçasının birlikte kullanılmasına yönelik bir proje üzerinde de çalışıyorum. Bu eminim bir çoğunuzun ilginizi çekecek, en kısa sürede bu konu ile ilgili de sizler ile yazılar paylaşacağım.
O zamana kadar, kendinize iyi bakın. Mutlu kodlamalar 🙂