Namespaces
Variants

std::forward_list<T,Allocator>:: merge

From cppreference.net

void merge ( forward_list & other ) ;
(1) (C++11부터)
(C++26부터 constexpr)
void merge ( forward_list && other ) ;
(2) (C++11부터)
(C++26부터 constexpr)
template < class Compare >
void merge ( forward_list & other, Compare comp ) ;
(3) (C++11부터)
(C++26부터 constexpr)
template < class Compare >
void merge ( forward_list && other, Compare comp ) ;
(4) (C++11부터)
(C++26부터 constexpr)

두 개의 정렬된 목록을 하나의 정렬된 목록으로 병합합니다.

  • 만약 other * this 와 동일한 객체를 참조하면, 아무 작업도 수행하지 않습니다.
  • 그렇지 않으면, other 의 모든 요소를 * this 로 전송합니다. 병합 후 other 는 비어 있게 됩니다.

이 연산은 안정적입니다:

  • 두 목록에서 동등한 요소들에 대해, * this 의 요소들은 항상 other 의 요소들보다 앞에 위치합니다.
  • * this other 의 동등한 요소들의 순서는 변경되지 않습니다.
1,2) 다음에 해당함 merge ( other, std:: less < T > ( ) ) (C++14 이전) merge ( other, std:: less <> ( ) ) (C++14 이후) .
3,4) 요소들은 comp 를 사용하여 비교됩니다.
다음 조건 중 하나라도 만족되면, 동작은 정의되지 않습니다:
  • * this 또는 other 가 비교자 comp 에 대해 정렬되지 않은 경우 .
  • get_allocator ( ) == other. get_allocator ( ) false 인 경우.

어떤 반복자나 참조도 무효화되지 않습니다. * this 에서 이동된 요소들에 대한 포인터와 참조, 그리고 이 요소들을 참조하는 반복자들은 other 가 아닌 * this 의 동일한 요소들을 참조하게 됩니다.

목차

매개변수

other - 병합할 다른 컨테이너
comp - 비교 함수 객체(즉, Compare 요구 사항을 만족하는 객체)로 첫 번째 인수가 두 번째 인수보다 작은 경우 (즉, 순서상 앞서는 경우 ) ​ true 를 반환합니다.

비교 함수의 시그니처는 다음과 동일해야 합니다:

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

시그니처에 const & 가 필요하지는 않지만, 함수는 전달된 객체를 수정해서는 안 되며 값 범주 에 관계없이 (가능한 const) Type1 Type2 타입의 모든 값을 수용할 수 있어야 합니다 (따라서 Type1& 는 허용되지 않으며 , Type1 Type1 에 대해 이동이 복사와 동등하지 않는 한 허용되지 않습니다 (C++11부터) ).
Type1 Type2 타입은 forward_list < T, Allocator > :: const_iterator 타입의 객체를 역참조한 후 두 타입 모두로 암시적으로 변환될 수 있어야 합니다. ​

타입 요구 사항
-
Compare Compare 요구 사항을 충족해야 합니다.

예외

어떤 이유로든 예외가 발생하면, 이러한 함수들은 아무런 효과를 가지지 않습니다 ( strong exception safety guarantee ). 단, 비교 연산에서 발생한 예외는 제외합니다.

복잡도

만약 other * this 와 동일한 객체를 참조하는 경우, 비교 연산이 수행되지 않습니다.

그렇지 않으면, N 1 std:: distance ( begin ( ) , end ( ) ) 로, N 2 std:: distance ( other. begin ( ) , other. end ( ) ) 로 설정합니다:

1,2) 최대 N 1 +N 2 -1 번의 비교를 operator < 를 사용하여 수행합니다.
3,4) 최대 N 1 +N 2 -1 번의 비교 함수 comp 적용.

예제

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

출력:

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

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 2045 C++11 O(1) 노드 이동이 보장될 수 없음
get_allocator ( ) ! = other. get_allocator ( )
이 경우 동작은
정의되지 않음
LWG 3088 C++11 * this other 가 동일한 객체를
참조할 때의 효과가 명시되지 않음
operator < 가 포인터 요소에 대해 오동작 가능
no-op로 명시
구현에 따라 정의됨
엄격한 전체 순서 사용

참고 항목

다른 forward_list 로부터 요소들을 전송
(public member function)
두 개의 정렬된 범위를 병합
(function template)
두 개의 정렬된 범위를 제자리에서 병합
(function template)
두 개의 정렬된 범위를 병합
(algorithm function object)
두 개의 정렬된 범위를 제자리에서 병합
(algorithm function object)