26 Aralık 2019 Perşembe

std::swap metodu

Giriş
İmzası şöyle.
template< class T >
void swap( T& a, T& b );
std::swap() ile iki tane değişkenin değerlerinin yer değiştirmesini sağlar. Bazı veri yapıları - örneğin std::vector - kendi swap() metoduna sahiptir.


C++03
C++03 ile copy constructor'a dayanır. Şöyledir.
template<typename T> void swap(T& t1, T& t2) {
    T tmp(t1);
    t1=t2;
    t2=tmp;
}
Bunun maliyetini okumak için olaya şöyle bakabiliriz.
template<typename T> void swap(T& t1, T& t2) {
  T tmp(t1); // duplicate t1, making an expensive copy of each element
  t1=t2;     // discard the original contents of t1,
             // and replace them with an expensive duplicate of t2
  t2=tmp;    // discard the original contents of t2,
             // and replace them with an expensive duplicate of tmp
}   
C++11
C++11 ile move constructor'a dayanır. Şöyledir.
template <typename T> void swap(T& t1, T& t2) {
  T temp = std::move(t1);
  t1 = std::move(t2);
  t2 = std::move(temp);
}
Kendi Byte Swap Metodumuz
Eğer elimizde bir POD olsaydı byte byte swap mümkün olurdu. Şöyle yaparız. Ancak bu kod örneğin atomic tiplerin swap işlemi için kullanılamaz.
template <class T>
void swap(T& a, T& b) {
  unsigned char x;
  auto pa = reintepret_cast<unsigned char*>(&a);
  auto pb = reintepret_cast<unsigned char*>(&b);
  auto pc = pa + sizeof(a);
  while (pa != pc) {
    x = *pa;
    *pa = *pb;
    *pb = x;
    ++pa, ++pb;
  }
}
XOR İle Swap
Eskiden swap işlemleri için tricky kodlar yazılır. XOR swap şöyle. Şimdi bu tür şeyleri kullanmaya gerek kalmadı.

x ve y değişkenlerini yer değiştirmek için
x ^= y;
y ^= x;
x ^= y;
ve
x = x + y
y = x - y
x = x - y 
yapılabilir. Ancak bu tür kodlar, floatin point, strucy, pointer gibi şeyler için işe yaramaz!

Hiç yorum yok:

Yorum Gönder