Giriş
İmzası şöyle.
C++03
C++03 ile copy constructor'a dayanır. Şöyledir.
C++11 ile move constructor'a dayanır. Şöyledir.
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.
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
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++11C++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 MetodumuzEğ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 SwapEskiden 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;
vex = 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