std::list::merge
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.
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ą:
Sygnatura nie musi zawierać parametru |
Zwracana wartość
(brak)
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ą.
Złożoność
Co najwyżej std::distance(begin(), end()) + std::distance(other.begin(), other.end()) - 1 porównań.
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
See also
| przenosi elementy z innego kontenera list (publiczna metoda) |