Sırasız kapsayıcılar kullanan bir (C++) kitaplığı geliştiriyorum. Bunlar, sakladıkları elemanların türleri için bir (genellikle std::hash
şablon yapısının bir uzmanlaşması) bir kesici gerektirir. Benim durumumda, bu öğeler, the bottom of this page adresindeki örneğe conststr
benzer şekilde dizgi değişmezlerini kapsülleyen sınıflardır. here, in the 'Notes' section açıklandığı gibi STL, ancak, sadece işaretçileri hesaplar sabit karakter işaretçiler, bir uzmanlık sunmaktadır:Eşit dizgi değişmezlerinin aynı adreste depolanıp depolanmadığını kontrol edin
C dizeleri için hiçbir uzmanlaşma yoktur.
std::hash<const char*>
işaretçinin (bellek adresi) değerinin bir karmasını üretir, bu herhangi bir karakter dizisinin içeriğini incelemez.
this question açıklandığı gibi bu (ya da ben öyle düşünüyorum), bu birkaç eşit dize hazır aynı adreste saklanır olsun standart C++ tarafından garanti edilmemektedir çok hızlı olmasına rağmen. Eğer böyle değilse, hashers ilk koşul yerine getirilmeyecektir:
iki parametre k1 ve eşit k2 içinBen seçici kullanarak karma hesaplamak istiyoruz,
std::hash<Key>()(k1) == std::hash<Key>()(k2)
Daha önce bahsi geçen garanti verilmişse uzmanlık sağlanmışsa veya başka bir algoritma sağlanmışsa. Başlıklarımı içerenlere sorma veya belirli bir makroyu tanımlamak için kitaplığımı oluşturma isteğine başvurmak mümkün olsa da, tanımlı bir uygulama tercih edilebilir.
Herhangi bir C++ uygulamasında makro var mı, ancak çoğunlukla g ++ ve argo, tanımı, aynı adreste birkaç eşit dize değişmezinin depolanmasını garanti eder?
Bir örnek:
#ifdef __GXX_SAME_STRING_LITERALS_SAME_ADDRESS__
const char str1[] = "abc";
const char str2[] = "abc";
assert(str1 == str2);
#endif
Kesinlikle değil, çünkü sadece "* aynı adreste depolanan * eşit dizgiler" değil, daha büyük bir dizenin alt dizeleri olarak depolanan çok sayıda dizedir. Örneğin, iki "lite" kelimesi "dünya" ve " merhaba dünya "', derleyici gibi kod üretebilir. data: bayt STR {h, e, l, l, o, w, o, r, l, d} ikincisi "STR". – Manu343726
Dize değişmezleri birleştirilse bile, iki 'char []' değişkeni olmayacaktır. st1 == str2' asla doğru olmaz. –
Kapsayıcınız için 'std :: string' kullanamaz mısınız?Veya char diziler? – quantdev