C++ Academy · Ders

Özel Karşılaştırıcılar

Sıralamayı denetleyin

4. ders / 413 adım

Özel Karşılaştırıcılar, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.

Neden Özel Karşılaştırıcılar?

Varsayılan olarak sıralı konteynerler std::less ile artan düzende sıralanır. Özel bir karşılaştırıcı bu düzeni değiştirmenizi sağlar; örneğin azalan düzende veya belirli bir alana göre sıralayabilirsiniz.

#include <iostream>
#include <set>

int main() {
    std::set<int> ascending{3, 1, 2};
    for (int x : ascending) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

std::greater ile Azalan Sıralama

En basit özel karşılaştırıcı, azalan düzende sıralama yapan standart fonksiyon nesnesi std::greater'dır.

#include <iostream>
#include <set>
#include <functional>

int main() {
    std::set<int, std::greater<int>> s{3, 1, 2};
    for (int x : s) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

map'te Karşılaştırıcı

Karşılaştırıcı, std::map'in üçüncü şablon parametresidir. Burada anahtarlar büyükten küçüğe sıralanır.

#include <iostream>
#include <map>
#include <functional>

int main() {
    std::map<int, std::string, std::greater<int>> m{
        {1, "one"}, {3, "three"}, {2, "two"}
    };
    for (const auto& [k, v] : m) std::cout << k << ':' << v << ' ';
    std::cout << '\n';
    return 0;
}

Karşılaştırıcılar Nasıl Çalışır?

Karşılaştırıcı, iki bağımsız değişken alan ve ilkinin ikinciden önce gelmesi gerekiyorsa true döndüren çağrılabilir bir yapıdır. Katı bir zayıf sıralama tanımlamalıdır.

#include <iostream>

struct Less {
    bool operator()(int a, int b) const { return a < b; }
};

int main() {
    Less cmp;
    std::cout << std::boolalpha << cmp(2, 5) << '\n';
    std::cout << cmp(5, 2) << '\n';
    return 0;
}

Özel Bir Yapı Karşılaştırıcısı

operator() içeren kendi fonksiyon nesnesi yapınızı tanımlayın ve türünü karşılaştırıcı olarak aktarın.

#include <iostream>
#include <set>

struct ByAbs {
    bool operator()(int a, int b) const {
        return (a < 0 ? -a : a) < (b < 0 ? -b : b);
    }
};

int main() {
    std::set<int, ByAbs> s{-5, 3, -1, 4};
    for (int x : s) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

Dizeleri Uzunluğa Göre Sıralama

Karşılaştırıcılar herhangi bir özelliği karşılaştırabilir. Burada dizeler önce uzunluğa, eşitlik bozucu olarak da alfabetik sıraya göre düzenlenir.

#include <iostream>
#include <set>
#include <string>

struct ByLen {
    bool operator()(const std::string& a, const std::string& b) const {
        if (a.size() != b.size()) return a.size() < b.size();
        return a < b;
    }
};

int main() {
    std::set<std::string, ByLen> s{"bbb", "a", "cc", "dd"};
    for (const auto& x : s) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

Eşitlik Bozucular Neden Önemlidir?

Karşılaştırıcınız hiçbir öğenin diğerinden önce gelmediğini söylüyorsa konteyner bunları eşit kabul eder. set içinde bu, birinin yinelenen olarak atılması anlamına gelir.

#include <iostream>
#include <set>
#include <string>

struct LenOnly {
    bool operator()(const std::string& a, const std::string& b) const {
        return a.size() < b.size();
    }
};

int main() {
    std::set<std::string, LenOnly> s{"ab", "cd", "x"};
    std::cout << s.size() << " elements\n";
    return 0;
}

Karşılaştırıcı Olarak Lambda'lar

Türünü decltype aracılığıyla ve lambda'nın kendisini kurucuya aktararak bir lambda kullanabilirsiniz.

#include <iostream>
#include <set>

int main() {
    auto cmp = [](int a, int b) { return a > b; };
    std::set<int, decltype(cmp)> s(cmp);
    s.insert(1);
    s.insert(3);
    s.insert(2);
    for (int x : s) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

priority_queue'da Karşılaştırıcılar

Karşılaştırıcılar std::priority_queue'yu da yapılandırır. std::greater ile bu yapı bir min-yığınına dönüşür.

#include <iostream>
#include <queue>
#include <vector>
#include <functional>

int main() {
    std::priority_queue<int, std::vector<int>, std::greater<int>> pq;
    pq.push(5); pq.push(1); pq.push(3);
    while (!pq.empty()) { std::cout << pq.top() << ' '; pq.pop(); }
    std::cout << '\n';
    return 0;
}

Çiftleri Karşılaştırma

Bir çift kümesini ikinci öğeye göre sıralamak için .second değerini inceleyen bir karşılaştırıcı yazın.

#include <iostream>
#include <set>
#include <utility>

struct BySecond {
    bool operator()(const std::pair<int,int>& a, const std::pair<int,int>& b) const {
        return a.second < b.second;
    }
};

int main() {
    std::set<std::pair<int,int>, BySecond> s{{1, 9}, {2, 3}, {3, 6}};
    for (const auto& p : s) std::cout << p.first << ':' << p.second << ' ';
    std::cout << '\n';
    return 0;
}

Şeffaf Karşılaştırıcılar

std::less<> kullanmak (boş açılı ayraçlarla) C++14'te farklı türlerle aramayı etkinleştirir ve geçici anahtar dönüşümlerini önler.

#include <iostream>
#include <set>
#include <functional>

int main() {
    std::set<int, std::less<>> s{1, 2, 3};
    std::cout << (s.find(2) != s.end() ? "found" : "no") << '\n';
    return 0;
}

Hızlı Kontrol

Karşılaştırıcıların eşitliği nasıl tanımladığı konusundaki anlayışınızı sınayın.

Özet

Özel karşılaştırıcılarla ilgili şunları öğrendiniz:

  • konteynerin karşılaştırıcı şablon parametresi aracılığıyla sıralamayı değiştirirler
  • std::greater, bir fonksiyon nesnesi yapısı veya ( decltype aracılığıyla) bir lambda olabilirler
  • eşitliği eşdeğerlik yoluyla tanımlarlar; bu nedenle farklı öğelerin kaybolmasını önlemek için her zaman bir eşitlik bozucu ekleyin

Sıradaki kurs: std::unordered_map ile hızlı hash tabanlı arama.

Başlamak ücretsiz

Yapay zeka eğitmeniyle C++ öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
51
Dersler
203

Sıkça Sorulan Sorular

“Özel Karşılaştırıcılar” dersi ücretsiz mi?

Evet — “Özel Karşılaştırıcılar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.

“Özel Karşılaştırıcılar” dersinde ne öğreneceğim?

Sıralamayı denetleyin C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C++ Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Özel Karşılaştırıcılar” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. std::map
  2. std::set
  3. multimap ve multiset
  4. Özel Karşılaştırıcılar
← C++ Academy Sayfasına Dön