C ++ 23: Dört yeni ilişkisel kap

Adanali

Active member
C ++ 23: Dört yeni ilişkisel kap


  1. C ++ 23: Dört yeni ilişkisel kap

Dört üyelik kapsayıcıları std::flat_map, std::flat_multimap, std::flat_set VE std::flat_multiset C ++ 23'te, sipariş edilen dernek konteynırlarının basit bir yerine geçiyorlar std::map, std::multimap, std::set VE std::multiset. C ++ 23'te iki nedenden dolayı var: hafıza tüketimi ve performans.










Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.













C ++ 23 ile 12 ilişkilendirme kapımız var. On iki? Doğru!

  • C ++ 98: std::map, std::set, std::multimap VE std::multiset
  • C ++ 11: std::unordered_map, std::unordered_set, std::unordered_multimap VE std::unordered_multiset
  • C ++ 23: std::flat_map, std::flat_set, std::flat_multimap VE std::flat_multiset
Sistematik burada acilen gereklidir. C ++ 98 ve C ++ 11'in ilişkilendirme kapları ile başlıyorum.

İlişkisel kaplar


Tüm ilişkisel kapların bir anahtarın bir değerin bir anahtarını bağlaması için ortak vardır. Bu nedenle, değer anahtar kullanılarak elde edilebilir. C ++ 98'in ilişkilendirme kapları, C ++ 11 ile düzensiz olan ilişkisel kaplar olan ilişkisel kaplardır.



Üyelik kapsayıcılarını sınıflandırmak için üç basit soruyu cevaplamanız gerekir:

  • Anahtarlar sipariş mi?
  • Anahtarın ilişkili bir değeri var mı?
  • Bir anahtar birden fazla görünebilir mi?
2 = 8 satır ile aşağıdaki tablo üç soruyu cevaplar. Tablodaki dördüncü bir soruyu cevaplıyorum. Erişim süresi ortalama ne kadar hızlı?









Performans özelliklerini anlamak için ilişkisel kaplar hakkında daha fazla bilgi vermek istiyorum.

Atanmış dernek kapları


Organize birliktelik kaplarının anahtarları düzenlenmiştir. En küçük rapor (p>
Bu siparişin ilginç sonuçları var.

  • Anahtar bir düzenleyici raporu desteklemelidir.
  • İlişkisel kaplar genellikle siyah kırmızı ağaçlar olarak uygulanır. Bunlar dengeli ikili araştırma ağaçlarıdır.
  • Anahtarın erişim süresi ve dolayısıyla değer için de logaritmiktir.
Kullanılan en sık kullanılan ilişkisel kapsayıcı std:🗺



std::map<int, std::string> int2String{
{3, "three"}, {2, "two"}, {1, "one"},
{5, "five"}, {6, "six"}, {4, "four"},
{7, "seven"} };


Dengeli ikili araştırma ağacı aşağıdaki yapıya sahip olabilir:









Sosyal olmayan kaplar


Düzensiz ilişkisel kabın ana fikri, anahtarın karma işlevi kullanılarak kovada gösterilmesidir. Değer basitçe anahtara bağlıdır.

Düzensiz ilişkisel kaplar anahtarlarını kuru olarak saklar. Kovanın geldiği anahtar, anahtarı net bir sayı üzerindeki anahtarı tasvir eden karma işlevine bağlıdır. Bu sayı modül kova numarası ile paylaşılır. Aynı kovaya farklı anahtarlar atanırsa, bir çarpışma sözü vardır. İyi bir karma işlevi ile anahtarlar eşit olarak dağıtılır. Değer basitçe anahtara bağlıdır.

Karma fonksiyonun kullanımının dağınık ilişki konteyneri için önemli sonuçları vardır.

  • Anahtar için karma işlevi mevcut olmalıdır.
  • Anahtarlar, çarpışmalarla karşılaşabilmek için eşitlik arasında bir karşılaştırmayı desteklemelidir.
  • Karma fonksiyonunun yürütülme süresi sabit olduğundan, anahtarlar eşit olarak dağıtılırsa, düzensiz bir ilişkisel bir konteynerin anahtarlarına erişim süresi sabittir.
Saniye std::map VE std::unordered_map En sık kullanılan düzensiz ilişki kapları.



std::unordered_map<std::string, int> str2Int{
{"Grimm",491634333356},
{"Grimm-Jaud", 49160123335},
{"Schmidt",4913333318},
{"Huber",490001326} };



Grafik, karma işlevini kullanarak kovanın kovalarının atanmasını gösterir.









Dört üyelik kapsayıcıları std::flat_map, std::flat_multimap, std::flat_set VE std::flat_multiset C ++ 23'te, sipariş edilen dernek konteynırlarının basit bir yerine geçiyorlar std::map, std::multimap, std::set VE std::multiset.

Konteyner adaptörleri


C ++ 23'teki bulaşıkları sipariş eden ilişkilendirme konteynırları, C ++ 98'deki muadilleriyle aynı arayüze sahiptir.

İlişkilendirme konteynırları sipariş edilen bulaşıklara konteyner adaptörleri olarak adlandırılır, çünkü anahtarları ve değerleri için ayrı sıralı kaplara ihtiyaç duyarlar. Bu sıralı kap, isteğe bağlı erişime sahip bir yineleyiciyi desteklemelidir. Varsayılan olarak, bir std::vector kullanılmış, ama aynı zamanda bir std::array oa std::deque Mümkün.

Aşağıdaki kod parçası, std::flat_map VE std::flat_set:



template<class Key, class T,
class Compare = less<Key>,
class KeyContainer = vector<Key>,
class MappedContainer = vector<T>>
class flat_map;

template<class Key,
class Compare = less<Key>,
class KeyContainer = vector<Key>>
class flat_set;


İlişkisel konteyner düzenli tabağının nedeni performans.

Sipariş edilen yemeklerin ve onların alat olmayan muadillerinin karşılaştırılması


. Derneği kapları yemek siparişi Sipariş edilen kaplardan farklı bir bellek zamanı ve karmaşıklığı sunun. Daha az depolama alanına ihtiyacınız vardır ve ilgisiz karşı taraflarınızdan daha hızlı okunabilir. Ücretsiz erişime sahip bir yineleyici sunarlar.

. İlişkisiz ilişkisel kaplar Bir elemanın eklenmesi veya ortadan kaldırılması sırasında performansı artırır. Ayrıca, yineleyicilerin bir elemanı ekledikten veya ortadan kaldırdıktan sonra geçerli kaldığını garanti eder. Çift yönlü bir yineleyici destekliyorlar.

Şimdiye kadar sayılar gösteremedim çünkü hiçbir derleyici ilişki konteynırlarını desteklemiyor. Performans testimi güncelleyeceğim “Std :: MAP ve Std :: Non Orderd_map ile diğer özel arkadaşlar” std::flat_map Mevcuttur.

Sırada ne var?


A std::mdspan Nesnelerin tutarlı bir bölümüne ait olmayan çok boyutlu bir vizyondur (bitişik bir nesne dizisi değil çok boyutlu görünüm). Bu tutarlı nesne dizisi, basit bir C dizisi, boyutta bir işaretçi olabilir, std::arrayA std::vector oa std::string Olmak.


(RME)
 
Üst