Yükleniyor...

C++ set ve multiset ile Eşsiz Elemanlar

C++ std::set ve std::multiset kullanımını öğrenin. Benzersiz elemanlar, sıralı veri yapıları ve performans farkları örneklerle anlatılıyor.

C++ Standard Library’de set ve multiset, elemanları sıralı şekilde tutan ve ağaç tabanlı çalışan ilişkilendirilmemiş (associative) konteynerlerdir. Temel farkları, set içinde bir elemandan sadece bir adet bulunabilirken; multiset bir elemandan birden fazla kopya saklayabilir. Her ikisi de kırmızı-siyah ağaç (red-black tree) üzerinde çalışır ve otomatik sıralama sağlar.


1) set Nedir?

std::set, her elemandan yalnızca bir tane bulunduran ve elemanları otomatik sıralı şekilde tutan bir konteynerdir.


#include <set>
#include <iostream>
using namespace std;

int main() {
    set<int> numbers;

    numbers.insert(30);
    numbers.insert(10);
    numbers.insert(20);
    numbers.insert(10); // tekrar eklense bile yalnızca bir tane kalır

    for (int n : numbers)
        cout << n << " ";
}

Çıktı: 10 20 30


2) set Özellikleri


// Eleman arama
set<int> s = {10, 20, 30};

if (s.contains(20))
    cout << "Bulundu!";

3) multiset Nedir?

std::multiset, set’e benzer ancak aynı elemandan birden fazla saklanmasına izin verir.


#include <set>
#include <iostream>
using namespace std;

int main() {
    multiset<int> nums;

    nums.insert(20);
    nums.insert(10);
    nums.insert(20);  // tekrar ekleme kabul edilir
    nums.insert(30);

    for (int n : nums)
        cout << n << " ";
}

Çıktı: 10 20 20 30


4) multiset ile Eleman Sayma


multiset<int> ms = {10, 20, 20, 30};

cout << "20 sayısı: " << ms.count(20) << endl;

Çıktı: 20 sayısı: 2


5) set vs multiset Karşılaştırması

Özelliksetmultiset
Benzersiz elemanEvetHayır
Sıralı yapıEvetEvet
Ekleme maliyetiO(log n)O(log n)
Yinelenen elemanEngellenirİzin verilir

Sonuç: Aynı elemandan birden fazla bulunması gerekiyorsa multiset, aksi durumda set kullanılmalıdır.


6) Sıralı Erişim ve Aralık Aramaları


set<int> s = {10, 20, 30, 40, 50};

auto it = s.lower_bound(25); // >= 25 olan ilk eleman
cout << *it << endl;

it = s.upper_bound(30); // > 30 olan ilk eleman
cout << *it << endl;

7) Silme İşlemleri


set<int> s = {10, 20, 30};

s.erase(20);      // anahtara göre silme
s.erase(s.begin()); // iterator ile silme

multiset<int> ms = {10, 20, 20, 30};

ms.erase(20);  // 20 olan TÜM elemanları siler

8) Uygulamalı Örnek – Kelime Frekansı Analizi

multiset ile kelime sıklığı toplama


#include <set>
#include <iostream>
#include <string>
using namespace std;

int main() {
    multiset<string> words;

    words.insert("hello");
    words.insert("world");
    words.insert("hello");
    words.insert("cpp");

    cout << "hello sayısı: " << words.count("hello") << endl;

    for (auto& w : words)
        cout << w << " ";
}

9) Hangi Durumda Hangisi?

Özet: set = benzersiz elemanlar multiset = çoklu elemanlar Her ikisi de otomatik sıralama sağlar.


10) TL;DR

  • set: benzersiz, sıralı, O(log n) ekleme/arama.
  • multiset: tekrarlı elemanlara izin verir, O(log n).
  • Aralık aramaları (lower_bound / upper_bound) desteklenir.
  • Her örnek Visual Studio 2022 ve GCC ile uyumludur.

İlişkili Makaleler