Przestrzenie nazw
Warianty
Działania

std::list::merge

Z cppreference.com
< cpp‎ | container‎ | list
void merge( list& other );
(1)
void merge( list&& other );
(1) (od C++11)
template <class Compare>
void merge( list& other, Compare comp );
(2)
template <class Compare>
void merge( list&& other, Compare comp );
(2) (od C++11)

Scala dwie posortowane listy w jedną. Listy powinny być posortowane w porządku rosnącym.

Nie są wykonywane żadne kopie elementów. Kontener other staje się pusty po wykonaniu tej operacji. Funkcja nie robi niczego, jeśli this == &other. Jeśli get_allocator() != other.get_allocator(), zachowanie jest niezdefiniowane. Żadne iteratory ani referencje nie zostają unieważnione, z uwzględnieniem tego, że iteratory na przeniesione elementy teraz wskazują do nich w *this, a nie w other. Pierwsza wersja wykorzystuje operator< do porównywania elementów, druga wykorzystuje do tego podaną funkcję porównującą comp.

Ta operacja jest stabilna: dla równoważnych elementów w obu listach, elementy z *this będą w scalonej liście przed elementami other, a kolejność równoważnych elementów z *this i other nie ulega zmianie.

Spis treści

[edytuj] Parametry

other - drugi kontener do scalenia
comp - obiekt funkcji porównującej (tj. obiekt spełniający wymagania Compare), który zwraca ​true jeśli pierwszy element jest mniejszy (tj. wcześniejszy w kolejności) niż drugi.

Sygnatura funkcji powinna być równoważna z następującą:

 bool cmp(const Type1 &a, const Type2 &b);

Sygnatura nie musi zawierać parametru const &, ale funkcja nie może modyfikować przekazanych do niej elementów.
The types Type1 and Type2 must be such that an object of type list<T,Allocator>::const_iterator can be dereferenced and then implicitly converted to both of them. ​

[edytuj] Zwracana wartość

(brak)

[edytuj] Wyjątki

Jeśli zostanie wyrzucony wyjątek, zawartość kontenera się nie zmieni (strong exception guarantee), o ile wyjątek nie został wyrzucony przez funkcję porównującą.

[edytuj] Złożoność

Co najwyżej std::distance(begin(), end()) + std::distance(other.begin(), other.end()) - 1 porównań.

[edytuj] Przykład

#include <iostream>
#include <list>
 
std::ostream& operator<<(std::ostream& ostr, const std::list<int>& list)
{
    for (auto &i : list) {
        ostr << " " << i;
    }
    return ostr;
}
 
int main()
{
    std::list<int> list1 = { 5,9,0,1,3 };
    std::list<int> list2 = { 8,7,2,6,4 };
 
    list1.sort();
    list2.sort();
    std::cout << "list1:  " << list1 << "\n";
    std::cout << "list2:  " << list2 << "\n";
    list1.merge(list2);
    std::cout << "merged: " << list1 << "\n";
}

Wynik:

list1:   0 1 3 5 9
list2:   2 4 6 7 8
merged:  0 1 2 3 4 5 6 7 8 9

[edytuj] See also

przenosi elementy z innego kontenera list
(publiczna metoda) [edit]