當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


C++ Algorithm inplace_merge()用法及代碼示例


C++算法inplace_merge()函數用於將兩個連續的排序範圍[first, last)和[middle, last)合並為一個排序範圍[first, last)。

對於第一個版本使用運算符 < 比較元素,或者對於第二個版本使用給定的二進製比較函數 comp 比較元素。

用法

default (1)    template <class BidirectionalIterator>
                       void inplace_merge (BidirectionalIterator first, BidirectionalIterator middle,
                                                        BidirectionalIterator last);

custom (2)   template <class BidirectionalIterator, class Compare>
                     void inplace_merge (BidirectionalIterator first, BidirectionalIterator middle,
                                                     BidirectionalIterator last, Compare comp);

參數

first: 一個雙向迭代器,指向要合並並排序到單個範圍的兩個連續排序範圍中的第一個中的第一個元素。

last:一個雙向迭代器,指向要合並並排序到單個範圍的兩個連續排序範圍的第二個中的最後一個元素。

middle: 一個雙向迭代器,指向要合並並排序到單個範圍的兩個連續排序範圍中的第二個中的第一個元素的位置。

comp: 一個用戶定義的二元謂詞函數,它接受兩個參數,如果兩個參數是有序的,則返回真,否則返回假。它遵循嚴格的弱排序來對元素進行排序。

返回值

複雜度

如果有足夠的額外內存可用,那麽複雜性在 first 和 last 之間的距離上是線性的:執行 N-1 次比較並且最多移動兩倍的元素。

否則,複雜性是線性的:執行最多 N*log(N) 個元素比較,其中 N = last -first 並且最多執行這麽多元素交換。

數據競爭

範圍 [first, last) 中的對象被修改。

異常

如果任何元素比較、元素交換(或移動)或迭代器上的操作引發異常,則此函數將引發異常。

注意:無效的參數會導致未定義的行為。

例子1

讓我們看一個簡單的例子來演示 inplace_merge() 的使用:

#include <iostream>    
#include <algorithm>   
#include <vector>       
using namespace std;
 
void printVector(vector<int>& v)
{
    for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
        cout << ' ' << *it;
    cout << '\n';
}
 
int main () {
    vector<int> v1 = {5,10,15,20,25}, v2 = {50,40,30,20,10}, v3(10);
    vector<int>::iterator it;
 
    sort(v1.begin(), v1.end());
    sort(v2.begin(), v2.end());
    it = copy(v1.begin(), v1.end(), v3.begin());
    copy(v2.begin(), v2.end(), it);
    inplace_merge(v3.begin(), it, v3.end());
 
    cout << "Vector v1:";
    printVector(v1);
    cout << "Vector v2:";
    printVector(v2);
    cout << "Vector v3:";
    printVector(v3);
}

輸出:

Vector v1: 5 10 15 20 25
Vector v2: 10 20 30 40 50
Vector v3: 5 10 10 15 20 20 25 30 40 50

例子2

讓我們看另一個簡單的例子:

#include <iostream>     // std::cout
#include <algorithm>    // std::inplace_merge, std::sort, std::copy
#include <vector>       // std::vector

using namespace std;

int main () {
  int first[] = {5,10,15,20,25};
  int second[] = {50,40,30,20,10};
  vector<int> v(10);
  vector<int>::iterator it;

  sort (first,first+5);
  sort (second,second+5);

  it=copy (first, first+5, v.begin());
     copy (second,second+5,it);

  inplace_merge (v.begin(),v.begin()+5,v.end());

  cout << "The resulting vector contains:";
  for (it=v.begin(); it!=v.end(); ++it)
    cout << ' ' << *it;
  cout << '\n';

  return 0;
}

輸出:

The resulting vector contains:5 10 10 15 20 20 25 30 40 50

例子3

讓我們看另一個簡單的例子,演示使用 operator< 來使用 inplace_merge():

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main(void) {
   vector<int> v = {1, 3, 2, 4, 5};

   inplace_merge(v.begin(), v.begin() + 2, v.end());

   for (auto it = v.begin(); it != v.end(); ++it)
      cout << *it << endl;

   return 0;
}

輸出:

1
2
3
4
5

示例 4

讓我們看一個簡單的例子來演示使用比較函數的 inplace_merge() 的使用:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

bool descending_sort(int a, int b) {
   return (a > b);
}

int main(void) {
   vector<int> v = {3, 1, 5, 4, 2};

   inplace_merge(v.begin(), v.begin() + 2, v.end(), descending_sort);

   for (auto it = v.begin(); it != v.end(); ++it)
      cout << *it << endl;

   return 0;
}

輸出:

5
4
3
2
1

例 5

讓我們看另一個簡單的例子:

#include <vector>
#include <iostream>
#include <algorithm>
 
using namespace std; 
 
template<class Iter>
void merge_sort(Iter first, Iter last)
{
    if (last - first > 1) {
        Iter middle = first + (last - first) / 2;
        merge_sort(first, middle);
        merge_sort(middle, last);
        inplace_merge(first, middle, last);
    }
}
 
int main()
{
    vector<int> v{10, 2, -9, 0, 9, 7, 1, 3, 4};
    merge_sort(v.begin(), v.end());
    for(auto n:v) {
        cout << n << ' ';
    }
    cout << '\n';
    
    return 0;
}

輸出:

-9 0 1 2 3 4 7 9 10





相關用法


注:本文由純淨天空篩選整理自 C++ Algorithm inplace_merge()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。