İleri c++ eğitimi swap(iki değişkeni yer değiştirme) taktikleri

byanigli

Hectopat
Katılım
3 Ocak 2014
Mesajlar
541
Yer
İzmir, Turkey, Turkey
Daha fazla  
Cinsiyet
Erkek
Meslek
student of software engineering
Merhabalar, bugün sizlerle c++ programlara dillinde swap taktiklerinden bahsedip, template konusu tartışacağız.

İlk senaryomuz elimizde iki değişken olsun ve bunları yer değiştirmek isteyelim.

Kod:
void swap(int *r, int *s)
{
    int *pSwap = r;
    r = s;
    s = pSwap;
    return;
}

int main()
{
    int p = 7;
    int q = 9;
    swap(&p, &q);
    cout << "p = " << p << "q= " << q << endl;
    return 0;
}
Altıntı...

İlk yönetimimiz bu olabilirdi ama, bu yöntem çok masraflıdır. Örnekte görüldüğü sadece int tipindeki verileri swap ediyoruz. String veya float tipinde birşeyler gönderseydik eğer, hata alacaktık ve her veri tipi için bir fonksiyon tanımlayacaktık. Halbu ki her tanımladığımız fonksiyon aynı işi yapmaktadır.

2. Yöntem void pointer.
Kod:
#include <iostream>

using namespace std;

void mySwap(void **pA,void **pB)
{
  void *pC = *pA;
  *pA = *pB;
  *pB = pC;
}

int main ()
{
float fA = 5;
float fB = 19;
cout<<fA<<"and"<<fB <<endl;
mySwap((void**)&fA,(void**)&fB);
cout<<fA<<"and"<<fB;

string fs = "aas";
string fa = "abc";
cout<<fs<<"and"<<fa<<endl;
mySwap((void**)&fs,(void**)&fa);
cout<<fs<<"and"<<fa;

return 0;
}
Üstte gördüğümüz kod blogundaki gibi bir mekanizma kullanılabiliriz ama bu yöntemde görüldüğü gibi veri tipleri belli değil. Sadece değerleri gösteren pointera, bir pointer tanımlıyoruz, ve onların yerlerini değiştiriyoruz.
3. Ortak base class ve polimorfik yaklaşım
Kod:
#include <iostream>

using namespace std;

class Base{
public:
    virtual void Sswap(Base& other){};
};

class A :public Base
{
public:
    A(int a){_a= a;}
    int setA(int a){_a=a;};
    int getA(){return _a;};

    void Sswap(Base& other)
    {
        A& _A = dynamic_cast<A&>(other);
        int _temp = _a;
        _a= _A.getA();

    }
private:
    int _a;

};

void my_swap(Base& obj1, Base& obj2)
{
    obj1.Sswap(obj2);
}

int main()
{
   A a1(1);
   A a2(2);
   cout<< "a1: " << a1.getA()<<" "<< "a2: "<<a2.getA()<< endl;
   my_swap(a1,a2);
   cout<<"a1: " << a1.getA()<<"  "<< "a2: "<< a2.getA()<< endl;
}

Üstte gördüğümüz yöntem ise birinci değişkeni, ikinci değişkenle değiştirebiliriz ama bu yöntemde güvenli bir yöntem değildir. Runtime'da veri tipi kontrolu yapıyor olsada, complier time 'da her hangi bir veri tipi kontrolu yapmamaktadır.

3. Yöntem C macro tanımlanması

Kod:
#include <iostream>

#define my_swap(type, i, j) {type T = i; i=j; j=T;}
using namespace std;



int main()
{
   int a = 1;
   int b = 2;
   cout<< "a:" <<a<<" "<< "b: "<<b<< endl;
   my_swap(int,a,b);
   cout<<"a: " << a<<"  "<< "b: "<< b<< endl;
}
 
Güzel bir kaynak olmuş. Tebrik ederim hocam.
Hocam foruma çok şey katıyorsunuz. Tekrardan tebrikler.
İyi çalışmalar.
 
Uyarı! Bu konu 9 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Geri
Yukarı