Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

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

      From cppreference.com
      <cpp‎ |container‎ |list

      [edit template]
       
       
       
      std::list
      Member functions
      Non-member functions
      (until C++20)(until C++20)(until C++20)(until C++20)(until C++20)
      Deduction guides(C++17)
       
      void merge( list& other);
      (1)(constexpr since C++26)
      void merge( list&& other);
      (2)(since C++11)
      (constexpr since C++26)
      template<class Compare>
      void merge( list& other, Compare comp);
      (3)(constexpr since C++26)
      template<class Compare>
      void merge( list&& other, Compare comp);
      (4)(since C++11)
      (constexpr since C++26)

      Merges two sorted lists into one sorted list.

      • Ifother refers to the same object as*this, does nothing.
      • Otherwise, transfers all elements fromother to*this.other is empty after the merge.

      This operation is stable:

      • For equivalent elements in the two lists, the elements from*this always precede the elements fromother.
      • The order of equivalent elements of*this andother does not change.
      1,2) Equivalent tomerge(other,std::less<T>())(until C++14)merge(other,std::less<>())(since C++14).
      3,4) Elements are compared usingcomp.
      If any of the following conditions is satisfied, the behavior is undefined:
      • *this orother is notsorted with respect to the comparatorcomp.
      • get_allocator()== other.get_allocator() isfalse.

      No iterators or references become invalidated. The pointers and references to the elements moved from*this, as well as the iterators referring to these elements, will refer to the same elements of*this, instead ofother.

      Contents

      [edit]Parameters

      other - another container to merge
      comp - comparison function object (i.e. an object that satisfies the requirements ofCompare) which returns ​true if the first argument isless than (i.e. is orderedbefore) the second.

      The signature of the comparison function should be equivalent to the following:

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

      While the signature does not need to haveconst&, the function must not modify the objects passed to it and must be able to accept all values of type (possibly const)Type1 andType2 regardless ofvalue category (thus,Type1& is not allowed, nor isType1 unless forType1 a move is equivalent to a copy(since C++11)).
      The typesType1 andType2 must be such that an object of typelist<T, Allocator>::const_iterator can be dereferenced and then implicitly converted to both of them.​

      Type requirements
      -
      Compare must meet the requirements ofCompare.

      [edit]Exceptions

      If an exception is thrown for any reason, these functions have no effect (strong exception safety guarantee). Except if the exception comes from a comparison.

      [edit]Complexity

      Ifother refers to the same object as*this, no comparisons are performed.

      Otherwise, given\(\scriptsize N_1\)N1 asstd::distance(begin(), end()) and\(\scriptsize N_2\)N2 asstd::distance(other.begin(), other.end()):

      1,2) At most\(\scriptsize N_1 + N_2 - 1\)N1+N2-1 comparisons usingoperator<.
      3,4) At most\(\scriptsize N_1 + N_2 - 1\)N1+N2-1 applications of the comparison functioncomp.

      [edit]Example

      Run this code
      #include <iostream>#include <list> std::ostream& operator<<(std::ostream& ostr,conststd::list<int>& list){for(constint i: list)        ostr<<' '<< i;return ostr;} int main(){std::list<int> list1={5,9,1,3,3};std::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';}

      Output:

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

      [edit]Defect reports

      The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

      DRApplied toBehavior as publishedCorrect behavior
      LWG 300C++98the effect when*this andother refer
      to the same object was not specified
      specified as no-op
      LWG 1207C++98it was unclear whether iterators and/or references will be invalidatedkeep valid
      LWG 1215C++98O(1) node moving could not be guaranteed if
      get_allocator()!= other.get_allocator()
      the behavior is
      undefined in this case
      LWG 3088C++98operator< could misbehave for pointer elementsimplementation-defined
      strict total order used

      [edit]See also

      transfers elements from anotherlist
      (public member function)[edit]
      merges two sorted ranges
      (function template)[edit]
      merges two ordered ranges in-place
      (function template)[edit]
      merges two sorted ranges
      (algorithm function object)[edit]
      merges two ordered ranges in-place
      (algorithm function object)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/container/list/merge&oldid=135241"

      [8]ページ先頭

      ©2009-2025 Movatter.jp