Jump to content
Araştır
  • Diğer seçenekler ...
Sonuçları bul ...
Sonuçları bul ...
OzkanOzdemir

String Trim C++ using STL & Boost Library

Önerilen Mesajlar

Admin

Merhaba, bu konumuzda C++ 11, C++ 17 ve Boost kütüphanesinde string trim yani string değerimizin sonundaki ve başındaki boşlukları silmeyi öğreneceğiz.

Şunu belirtmek istiyorum Server dosyalarındaki kullanılan trim örneği C++ 11 kütüphanesine ait ve C++ 17 kütüphanesiyle derlemeye çalıştığınızda hata alacaksınız.

Bunun sebebi ise C++17'den beri standart kütüphanenin bazı kısımları kaldırıldı. Biz şimdi bu kaldırılan kısımları yeni kütüphaneye göre uyarlanmış halini göreceğiz.

Bir de şurada dikkate etmeniz gereken bir husus var.
Server dosyalarında kullanılan rtrim ve ltrim fonksiyonları hem geriye string değer döndürüyor hem de parametre olarak string değeri convert ediyor.
Bu yüzden std::string & rtrim yerine void rtrim kullanmanız daha mantıklı olacaktır.

Gizli İçerik

    Gizli içeriği görmek için bu konuya bir mesaj yazın.

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı


Bir de şurada dikkate etmeniz gereken bir husus var.
Server dosyalarında kullanılan rtrim ve ltrim fonksiyonları hem geriye string değer döndürüyor hem de parametre olarak string değeri convert ediyor.
Bu yüzden std::string & rtrim yerine void rtrim kullanmanız daha mantıklı olacaktır.



Verdiğin gerekçe doğru değil.

void func1(std::string str);
void func1(std::string &str);
Bu iki fonksiyonun amaçları farklı. Ancak eğer heapte olmayan bir değişkeni bu fonksiyonlara gönderirsen, stl sınıfların move constructorları olduğu için bu fonksiyonlara verilen değişkenler zaten taşınır hiç bir farkları yok.

Yine aynı şekilde,
std::string func1(std::string str);
std::string& func1(std::string &str);
Bu iki fonksiyondan referance dönen hatalı kullanım zaten. Eğer ki fonksiyon içinde stackte yarratığın değişkenin referansını dönersen explicit olarak move etmezsen zaten undefined behaviour sonucuyla karşılaşırsın.

Burada en doğru kullanım birincisi eğer ki stackte trim yapılmış obje dönülecekse. Çünkü birincisinde stl sınıfın move constructor ı kopyalama yapmaz, stackteki değişkeni move eder.

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
Verdiğin gerekçe doğru değil.

Alıntı
void func1(std::string str);
void func1(std::string &str);
Bu iki fonksiyonun amaçları farklı. Ancak eğer heapte olmayan bir değişkeni bu fonksiyonlara gönderirsen, stl sınıfların move constructorları olduğu için bu fonksiyonlara verilen değişkenler zaten taşınır hiç bir farkları yok.


Söylediğin senaryo "copy ellision" olarak geçer, eğer func1 fonksiyon çağrısından sonra str kısmına verdiğin parametreye refer etmiyorsan geçerli. Copy ellision c++17 standardına kadar mandatory bir olay değil. Hatta c++17 standardında dahi bazı caseler dışında mandatory değil. Dolayısıyla derleyicinin optimizasyon ayarlarına ve derleyicinin yazdığın pattern'i ne kadar iyi algılayabildiğine kalıyor olay. Özetle; Overload 1'e gelen her stack değişkeni move edilerek geliyor diye bir kaide yok. Bunun yerine rvalue overloadını yazıp değişkeni explicit move ile almak daha mantıklı, eğer ki istenen buysa.


Alıntı
Yine aynı şekilde,
std::string func1(std::string str);
std::string& func1(std::string &str);

Bu iki fonksiyondan referance dönen hatalı kullanım zaten. Eğer ki fonksiyon içinde stackte yarratığın değişkenin referansını dönersen explicit olarak move etmezsen zaten undefined behaviour sonucuyla karşılaşırsın.


Burada en doğru kullanım birincisi eğer ki stackte trim yapılmış obje dönülecekse. Çünkü birincisinde stl sınıfın move constructor ı kopyalama yapmaz, stackteki değişkeni move eder.


Burada da 2. overloadda referans, alınan parametreye ise bir sıkıntı yok. Builder pattern'ında sıkça kullanılan bir durum. Diğer senaryolarda ise function-local olan variable thread_local veya static olarak declare edilmediyse "reference to temporary" durumuyla karşılaşırsın.

İletiyi paylaş


Link to post
Sitelerde Paylaş

×
×
  • Yeni Oluştur...