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.
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. |
[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) |