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 includes()用法及代碼示例
- C++ Algorithm is_sorted()用法及代碼示例
- C++ Algorithm is_partitioned()用法及代碼示例
- C++ Algorithm iter_swap()用法及代碼示例
- C++ Algorithm is_heap()用法及代碼示例
- C++ Algorithm is_sorted_until()用法及代碼示例
- C++ Algorithm is_heap_until()用法及代碼示例
- C++ Algorithm remove_if()用法及代碼示例
- C++ Algorithm remove()用法及代碼示例
- C++ Algorithm max_element()用法及代碼示例
- C++ Algorithm set_union()用法及代碼示例
- C++ Algorithm next_permutation()用法及代碼示例
- C++ Algorithm upper_bound()用法及代碼示例
- C++ Algorithm minmax()用法及代碼示例
- C++ Algorithm remove_copy_if()用法及代碼示例
- C++ Algorithm random_shuffle()用法及代碼示例
- C++ Algorithm pop_heap()用法及代碼示例
- C++ Algorithm replace()用法及代碼示例
- C++ Algorithm set_intersection()用法及代碼示例
- C++ Algorithm lower_bound()用法及代碼示例
注:本文由純淨天空篩選整理自 C++ Algorithm inplace_merge()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。