11 Aralık 2019 Çarşamba

std::set_union metodu - İki Kümeyi Birleştirir

Giriş
Açıklaması şöyle.
Constructs a sorted union beginning at d_first consisting of the set of elements present in one or both sorted ranges [first1,last1) and [first2,last2).
Aynı eleman her iki kümede de varsa açıklaması şöyle.
set_union is an algorithm that produces a set of elements from both sets. For the elements appearing in intersection, it always picks them from the 1st set, not 2nd set.
Açıklaması şöyle.
The algorithm std::set_union requires ordered sequences.
Örnek
Elimizde şöyle bir kod olsun. a dizisi sıralıdır ancak b dizisi sıralı değildir. Bu yüzden çıktı olarak boş bir şey alırız.
std::vector<std::string> a = {"a","b"};
std::vector<std::string> b = {"d","c"};

std::vector<std::string> c;

std::set_union(a.begin(),a.end(),b.begin(),b.end(),c.begin());
Düzeltmek için şöyle yaparız
std::vector<std::string> a = { "a", "b" };
std::vector<std::string> b = { "d", "c" };

std::vector<std::string> c;

std::set_union( std::begin( a ), std::end( a ), 
                std::rbegin( b ), std::rend( b ),
                std::back_inserter( c ) );
Çıktı olarak şunu alırız.
a b c d 
Örnek
İki tane vector'ü çift elemanları atarak birleştirmek için şöyle yaparız.
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
    std::vector<int> v1 = {1, 2, 3, 4, 5}; 
    std::vector<int> v2 = {      3, 4, 5, 6, 7}; 
    std::vector<int> dest1;

    std::set_union(v1.begin(), v1.end(),
                   v2.begin(), v2.end(),                  
                   std::back_inserter(dest1));

    for (const auto &i : dest1) {
        std::cout << i << ' ';
    }   
    std::cout << '\n';
}
Çıktı olarak şunu alırız.
Output: 1 2 3 4 5 6 7
Diğer
Eğer std::set_union() kullanmak için diziyi sıralamak istemiyorsak şöyle yaparız
std::vector<std::string> a = { "a", "b" };
std::vector<std::string> b = { "d", "c", "a" };

std::vector<std::string> c( a );
c.insert( std::end( c ), std::begin( b ), std::end( b ) );

std::sort( std::begin( c ), std::end( c ) );

c.erase( std::unique( std::begin( c ), std::end( c ) ), std::end( c ) );
Çıktı olarak şunu alırız.
a b c d

Hiç yorum yok:

Yorum Gönder