C++ çalışma sorusu – 48

Elimizde yalnızca küçük harf karakterlerinden oluşan bir string var:

Böyle bir stringi aşağıdaki gibi stringe dönüştürmek istiyoruz:

stringe eklenen rakam karakterleri ardışık olarak yinelenen harf karakterlerinin sayısını gösteriyor. Yazmanız istenen işlevin bildirimi şöyle:

İşlevin parametresi dönüştürülecek string.
işlevin geri dönüş değeri dönüştürülmüş string.

İşlev tanımında STL‘in tüm öğelerini kullanabilirsiniz. Yazacağınız kodun doğru çalışmasının yanı sıra verimliliği de önemli.

Necati Ergin

C ve Sistem Programcıları Derneğinde eğitmen olarak çalışıyor.

Bunlar da ilginizi çekebilir

C++ çalışma sorusu – 48” için 4 yorum

  1. Necati bey selamlar;
    Çalışır bir cevap yazdım. Yorumlarsanız (daha profesyonel bir kod nasıl yazılabilirdi) sevinirim.

    1. Kenan Bey,

      while(sval == (*iter) && iter != lpos)
      Yukarıdaki ifadede lojik ve operatörünün ilk operandı tanımsız davranışa yol açabilir.
      sval == (*iter) ifadesi yürütülürken iter aralığının sonunu gösteriyor olabilir. Operandları yer değiştirirsek kısa devre davranışı sayesinde tanımsız davranıştan kurtulabiliriz. Böylece iter != lpos ifadesi yanlış olduğunda, yani iter aralığın bitişine denk geldiğinde dereference edilmeyecek.

      İkinci bir husus, push_back fonksiyonu çağrıldığında kabın kapasitesinin yeterli olmaması reallocation’ı tetikleyebilir. Bu durumda yeni bir bellek alanı tahsis edilmiş, kaptaki öğeler tahsis edilen bellek alanına kopyalanmış ve eski bellek alanı da serbest bırakılmış olabilir. Bu senaryoda kaptaki öğelerin bu işlemden önceki konumunu tutan pointerlar ve iteratörler geçersiz kılınmış olur.
      Kısa yazılarda kısa yazı optimizasyonu yüzünden bu hatayı yakalamak zor olabilir.
      Kodu 32 bitte derleyerek tanımsız davranışı gözlemleyebildim.

  2. Ölçüm yapmadım o yüzden verim konusunda bir şey diyemeyeceğim.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kod Eklemek İçin Okuyun