Merhaba sevgili yazılımperver dostlarım. Bu yazımda, kendi kodlarınızda da sıklıkla kullanabileceğiniz std::find_if API’sine ilişkin (ki kendisini STL algorithm kütüphanesi ile sunulur) örnek bir kod parçasına göz atacağız.
İlgili API’nin tanımlamasına bakacak olursak:
1 2 |
template <class InputIterator, class UnaryPredicate> InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred); |
API’nin resmi tanımı şöyle: tanımlanan [first, second] sınırları içerisinde, geçirilen pred
metodu doğru dönen ilk elemanı gösteren iteratorü döner.
Şimdi de std::find_if API’si ile C++ 11/14 ile sunulan “uniform initialization, auto” ve C++ 17 ile sunulan “if statement with initializer” kullanılan örnek kod parçasına bakalım. Bu kabiliyetler, genel olarak hep birlikte kullanılırlar, bu noktaya lütfen dikkat.
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 26 27 28 29 30 31 32 33 34 |
#include <algorithm> #include <iostream> #include <string> #include <vector> struct Person { int mId; std::string mName; }; int main() { std::vector<Person> personList = {{0, "Ahmet"}, {1, "Mehmet"}, {2, "Begum"}, {3, "Fatma"}}; // Burada kullanilan auto C++ 11 ile kullanima sunuldu if (auto item = std::find_if (personList.begin(), personList.end(), // Burada kullanilan auto ise C++ 14 ile kullanima sunuldu [] (const auto& arg) { return arg.mName == "Begum"; }) ; item != personList.end()) { std::cout << "The Begum is found. Its id is: " << item->mId << '\n'; } else { std::cout << "The Begum is not found!" << '\n'; } return 0; } |
Peki yukarıda gerçekleştirdiğimiz işleri, C++ 11 öncesinde nasıl yapardık, farkı görmek adına isterseniz bir de o koda bakalım. Eminim, farkı fark edeceksiniz 🙂
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
#include <algorithm> #include <iostream> #include <string> #include <vector> struct Person { int mId; std::string mName; // Ekstra yapicimiz Person(int id, const std::string& name) { mId = id; mName = name; } }; // "Predicate" metodumuz için kullanacagimiz fonksiyon nesneleri (std::find_if icin) struct isPersonPredicate { std::string mPersonToFind; isPersonPredicate(const std::string& personToLook) : mPersonToFind(personToLook) { } inline bool operator() (const Person& arg) { return (arg.mName == mPersonToFind); } }; int main () { std::vector<Person> personList; personList.push_back(Person(0, std::string("Ahmet"))); personList.push_back(Person(1, std::string("Mehmet"))); personList.push_back(Person(2, std::string("Begum"))); personList.push_back(Person(3, std::string("Fatma"))); std::vector<Person>::iterator item = std::find_if(personList.begin(), personList.end(), isPersonPredicate("Begum")); if (item != personList.end()) { std::cout << "The Begum is found. Its id is: " << item->mId << '\n'; } else { std::cout << "The Begum is not found!" << '\n'; } return 0; } |
Ekstra yapıcı, iterator ve “predicate” metot tanımlamaları ile kodun ne kadar büyüdüğünü görebilirsiniz. Modern C++ sayesinde, daha temiz ve okunabilir C++ kodu geliştirebilirsiniz (kendi fikrim 🙂
Ben yazılımperver, kendinize iyi bakın!