Sdílet prostřednictvím


merge

Spojuje všechny prvky ze dvou oblastí seřazené zdroje do jednoho, seřazené cílové oblasti, kde lze zadat kritéria řazení binárního predikátu.

template<class InputIterator1, class InputIterator2, class OutputIterator>
   OutputIterator merge(
      InputIterator1 _First1, 
      InputIterator1 _Last1,
      InputIterator2 _First2, 
      InputIterator2 _Last2, 
      OutputIterator _Result
   );
template<class InputIterator1, class InputIterator2, class OutputIterator, class BinaryPredicate>
   OutputIterator merge(
      InputIterator1 _First1, 
      InputIterator1 _Last1,
      InputIterator2 _First2, 
      InputIterator2 _Last2, 
      OutputIterator _Result
      BinaryPredicate _Comp
   );

Parametry

  • _First1
    Vstupní iterační adresování první prvek pozice v první dva seřazené zdrojových oblastí kombinované a seřazeny do jednoho rozsahu.

  • _Last1
    Vstupní iterační adresování postavení jednoho za poslední prvek v první dva seřazené zdrojových oblastí kombinované a seřazeny do jednoho rozsahu.

  • _First2
    Vstupní adresování první prvek pozice ve dvou po sobě jdoucích druhé iterace seřazeny zdrojových oblastí kombinované a seřazeny do jednoho rozsahu.

  • _Last2
    Vstupní iterace adresování jednu pozici minulých poslední prvek v druhé dvou po sobě jdoucích seřazeny zdrojových oblastí kombinované a seřazeny do jednoho rozsahu.

  • _Result
    Iterace výstup adresování pozici první prvek v cílové oblasti, kde mají být sloučeny do jediné seřazené oblasti dva zdrojové oblasti.

  • _Comp
    Uživatelem definované funkce predikátu objektu, který definuje smysl, ve kterém jeden prvek je větší než jiné.Binárního predikátu trvá dva argumenty a měl vrátit true při prvním prvkem je menší než druhý prvek a false jinak.

Vrácená hodnota

Iterace výstup adresování jednu pozici za poslední prvek v seřazené cílové oblasti.

Poznámky

Odkazovaný seřazené zdrojových oblastí musí být platné; všechny ukazatele musí být dereferenceable a v rámci každé sekvence musí být dostupná z první poslední pozice ve incrementation.

Cílová oblast buď zdrojové oblasti se nesmí překrývat a musí být dostatečně velká cílové oblasti.

Seřazené zdrojových oblastí každé uspořádán podmínkou pro použití korespondence algoritmus podle stejné pořadí jako je algoritmus používaný řazení kombinované rozsahy.

Operace je stabilní relativní pořadí prvků v každé oblasti je zachována v cílové oblasti.Zdrojové oblasti nebyly změněny algoritmus korespondence.

Nižší hodnoty typů vstupní u iterátorů třeba-než srovnatelné objednáno, tak, aby dané dva prvky, ji může stanovit nebo že jsou rovnocenné (v tom smyslu, že ani menší než ostatní), jeden je menší než ostatní.Výsledkem objednání mezi nonequivalent prvky.Při ekvivalentní prvky v obou zdrojových oblastí prvky v první oblasti předcházet prvky z druhé zdrojové oblasti v cílové oblasti.

Složitost algoritmu je lineární s nejvíce (_Last1 – _First1) – (_Last2 – _First2) – 1 porovnání.

Seznam třída poskytuje členské funkce korespondence sloučit dva seznamy prvků.

mergemá dva související formuláře:

checked_merge

unchecked_merge

Informace o chování těchto funkcí naleznete v tématu Zaškrtnuté iterátory.

Příklad

// alg_merge.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional>   // For greater<int>( )
#include <iostream>

// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser ( int elem1, int elem2 ) {
   if (elem1 < 0) 
      elem1 = - elem1;
   if (elem2 < 0) 
      elem2 = - elem2;
   return elem1 < elem2;
}

int main() {
   using namespace std;
   vector <int> v1a, v1b, v1 ( 12 );
   vector <int>::iterator Iter1a,  Iter1b, Iter1;

   // Constructing vector v1a and v1b with default less than ordering
   int i;
   for ( i = 0 ; i <= 5 ; i++ )
      v1a.push_back(  i );

   int ii;
   for ( ii =-5 ; ii <= 0 ; ii++ )
      v1b.push_back(  ii  );

   cout << "Original vector v1a with range sorted by the\n "
        << "binary predicate less than is  v1a = ( " ;
   for ( Iter1a = v1a.begin( ) ; Iter1a != v1a.end( ) ; Iter1a++ )
      cout << *Iter1a << " ";
   cout << ")." << endl;

   cout << "Original vector v1b with range sorted by the\n "
        << "binary predicate less than is  v1b = ( " ;
   for ( Iter1b = v1b.begin ( ) ; Iter1b != v1b.end ( ) ; Iter1b++ )
      cout << *Iter1b << " ";
   cout << ")." << endl;
   
   // Constructing vector v2 with ranges sorted by greater
   vector <int> v2a ( v1a ) , v2b ( v1b ) ,  v2 ( v1 );
   vector <int>::iterator Iter2a,  Iter2b, Iter2;
   sort ( v2a.begin ( ) , v2a.end ( ) , greater<int> ( ) );
   sort ( v2b.begin ( ) , v2b.end ( ) , greater<int> ( ) );

   cout << "Original vector v2a with range sorted by the\n "
        <<  "binary predicate greater is   v2a =  ( " ;
   for ( Iter2a = v2a.begin ( ) ; Iter2a != v2a.end ( ) ; Iter2a++ )
      cout << *Iter2a << " ";
   cout << ")." << endl;

   cout << "Original vector v2b with range sorted by the\n "
        <<  "binary predicate greater is   v2b =  ( " ;
   for ( Iter2b = v2b.begin ( ) ; Iter2b != v2b.end ( ) ; Iter2b++ )
      cout << *Iter2b << " ";
   cout << ")." << endl;

   // Constructing vector v3 with ranges sorted by mod_lesser
   vector <int> v3a ( v1a ), v3b ( v1b ) ,  v3 ( v1 );
   vector <int>::iterator Iter3a,  Iter3b, Iter3;
   sort ( v3a.begin ( ) , v3a.end ( ) , mod_lesser );
   sort ( v3b.begin ( ) , v3b.end ( ) , mod_lesser );

   cout << "Original vector v3a with range sorted by the\n "
        << "binary predicate mod_lesser is   v3a =  ( " ;
   for ( Iter3a = v3a.begin ( ) ; Iter3a != v3a.end ( ) ; Iter3a++ )
      cout << *Iter3a << " ";
   cout << ")." << endl;

   cout << "Original vector v3b with range sorted by the\n "
        << "binary predicate mod_lesser is   v3b =  ( " ;
   for ( Iter3b = v3b.begin ( ) ; Iter3b != v3b.end ( ) ; Iter3b++ )
      cout << *Iter3b << " ";
   cout << ")." << endl;

   // To merge inplace in ascending order with default binary 
   // predicate less <int> ( )
   merge ( v1a.begin ( ) , v1a.end ( ) , v1b.begin ( ) , v1b.end ( ) , v1.begin ( ) );
   cout << "Merged inplace with default order,\n vector v1mod =  ( " ;
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
      cout << *Iter1 << " ";
   cout << ")." << endl;

   // To merge inplace in descending order, specify binary 
   // predicate greater<int>( )
   merge ( v2a.begin ( ) , v2a.end ( ) , v2b.begin ( ) , v2b.end ( ) ,
       v2.begin ( ) ,  greater <int> ( ) );
   cout << "Merged inplace with binary predicate greater specified,\n "
        << "vector v2mod  = ( " ;
   for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
      cout << *Iter2 << " ";
   cout << ")." << endl;

   // Applying A user-defined (UD) binary predicate mod_lesser
   merge ( v3a.begin ( ) , v3a.end ( ) , v3b.begin ( ) , v3b.end ( ) ,
       v3.begin ( ) ,  mod_lesser );
   cout << "Merged inplace with binary predicate mod_lesser specified,\n "
        << "vector v3mod  = ( " ; ;
   for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )
      cout << *Iter3 << " ";
   cout << ")." << endl;
}

Výsledek

Original vector v1a with range sorted by the
 binary predicate less than is  v1a = ( 0 1 2 3 4 5 ).
Original vector v1b with range sorted by the
 binary predicate less than is  v1b = ( -5 -4 -3 -2 -1 0 ).
Original vector v2a with range sorted by the
 binary predicate greater is   v2a =  ( 5 4 3 2 1 0 ).
Original vector v2b with range sorted by the
 binary predicate greater is   v2b =  ( 0 -1 -2 -3 -4 -5 ).
Original vector v3a with range sorted by the
 binary predicate mod_lesser is   v3a =  ( 0 1 2 3 4 5 ).
Original vector v3b with range sorted by the
 binary predicate mod_lesser is   v3b =  ( 0 -1 -2 -3 -4 -5 ).
Merged inplace with default order,
 vector v1mod =  ( -5 -4 -3 -2 -1 0 0 1 2 3 4 5 ).
Merged inplace with binary predicate greater specified,
 vector v2mod  = ( 5 4 3 2 1 0 0 -1 -2 -3 -4 -5 ).
Merged inplace with binary predicate mod_lesser specified,
 vector v3mod  = ( 0 0 1 -1 2 -2 3 -3 4 -4 5 -5 ).

Požadavky

Záhlaví: <algorithm>

Obor názvů: std

Viz také

Referenční dokumentace

merge (STL Samples)

Predicate Version of merge

Standardní šablona knihovny