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.
- Elemanlar her zaman küçükten büyüğe sıralıdır.
- Bir eleman yalnızca bir kez bulunabilir.
- Ekleme, arama ve silme: O(log n)
- Rastgele erişim yok → iterasyon gerekir.
#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
- Sıralı eleman depolama
- Her eleman benzersiz
- O(log n) karmaşıklıkta arama ve ekleme
- lower_bound / upper_bound destekler
// 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.
- Elemanlar sıralıdır.
- Tekrarlı elemanlar saklanabilir.
- Ekleme, arama ve silme: O(log n)
- Rastgele erişim yoktur.
#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ı
| Özellik | set | multiset |
|---|---|---|
| Benzersiz eleman | Evet | Hayır |
| Sıralı yapı | Evet | Evet |
| Ekleme maliyeti | O(log n) | O(log n) |
| Yinelenen eleman | Engellenir | İ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?
- Tekrarsız eleman listesi gerekiyorsa → set
- Aynı elemandan birden fazla olabilirse → multiset
- Sıralı veriye ihtiyaç varsa → her ikisi de uygundur
- Performans kritikse → ikisi de O(log n) performansa sahiptir
Ö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.