19 Mart 2018 Pazartesi

std::pair Yapısı

Giriş
Şu satırı dahil ederiz.
#include <utility>
std::pair getFirst(), getSecond() gibi metodlar sunmaz. Bunun yerine first ve second isimli iki alan sunar. Ya da std::get ile kullanılabilir.

std::pair ve std::tuple birbirlerine çok benziyorlar ancak std::tuple<A,B> ile std::pair<A,B> farklı tiplerdir.

std::pair ve std::tuple STL ile mecburen kullanılıyor çünkü algoritmaların genel (generic) olması gerekiyor. Kendi kodumda ise, std::pair ve std::tuple yerine daha anlamlı struct veya class'lar kullanmayı tercih ediyorum.

Default constructor
std::pair verilen tiplerin default constructor'larını çağırır. Şu kod derlenmez.
class A
{
public:
    A (int a) {};
};

std::pair<std::string, A> p;

Constructor
Çevrim (Conversion) olmasına imkan tanır. İmzası şöyledir.
template< class U1, class U2 >
pair( const pair<U1, U2>& p );
Açıklaması şöyle
4) Initializes first with p.first and second with p.second. 
int tipindeki pair'den float tipine dönüşüm olmasına imkan tanır. Şöyle kullanabiliriz.
template<typename type> 
using point = std::pair<type, type>;

float dist(point<float> a, point<float> b)
{
    return pow(pow(a.first-b.first, 2) + pow(a.second - b.second, 2), 0.5);
}

int main() {
    std::cout << dist(point<int>{ 0, 0 }, point<int>{ 1, 1 });
    return 0;
}

< operator
std::pair < operatörünü overload eder. Önce firt elemanı karşılaştırır. Eğer aynı ise second elemanı karşılaştırır. Dolayısıyla sort algoritmalarında kullanılabilir. Örnek:
std::vector<std::pair<std::string, bool> > v;
std::sort(v.begin(), v.end());
is_trivial
std::pair trival değildir. Şöyle yaparız
std::cout << std::is_trivial<std::pair<int, int>>::value << std::endl;
Çıktı olarak şunu alırız.
0
is_trivially_copyable
std::pair trivally copyable değildir. Şöyle yaparız
std::cout << std::is_trivially_copyable<std::pair<int, int>>::value << std::endl;
Çıktı olarak şunu alırız.
0

Hiç yorum yok:

Yorum Gönder