C++ 算法 partial_sort_copy() 函數類似於 partial_sort() 函數,用於重新排列 range[first, last) 中的元素,使得 first 和 middle 之間的元素將被排序,而 middle 和 last 之間的元素將在一個未指定的順序。但是 partial_sort_copy() 函數將結果放入一個新的範圍 [result_first, result_last)。
第一個版本使用運算符比較元素,第二個版本使用 comp 進行比較。
用法
default (1) template <class InputIterator, class RandomAccessIterator>
RandomAccessIterator
partial_sort_copy (InputIterator first,InputIterator last,
RandomAccessIterator result_first,
RandomAccessIterator result_last);
custom (2) template <class InputIterator, class RandomAccessIterator, class Compare>
RandomAccessIterator
partial_sort_copy (InputIterator first,InputIterator last,
RandomAccessIterator result_first,
RandomAccessIterator result_last, Compare comp);
參數
first:一個輸入迭代器,指向要部分排序的源範圍中的第一個元素。
last:一個隨機訪問迭代器,指向要部分排序的源範圍中過去的最後一個元素。
result_first:一個隨機訪問迭代器,指向已排序目標範圍中的第一個元素。
result_last:隨機訪問迭代器,指向已排序目標範圍中過去的最後一個元素。
comp: 一個用戶定義的二元謂詞函數,它接受兩個參數,如果兩個參數按順序返回真,否則返回假。它遵循嚴格的弱排序來對元素進行排序。
返回值
它返回一個迭代器,該迭代器指向結果序列中寫入的最後一個元素之後的元素。
複雜度
平均複雜度在第一個和最後一個之間的距離上小於線性。執行最多 N*log (min (N, M)) 個元素比較,其中 N = last - first 和 M = middle - first。
數據競爭
範圍 [first, last) 中的對象被更改。
異常
如果任何元素比較、元素交換(或移動)或迭代器上的操作引發異常,則此函數將引發異常。
請注意,無效參數會導致未定義的行為。
例子1
讓我們看一個簡單的例子來演示 partial_sort_copy() 的使用:
#include <iostream> // std::cout
#include <algorithm> // std::partial_sort_copy
#include <vector> // std::vector
using namespace std;
bool myfunction (int i,int j) { return (i<j); }
int main () {
int myints[] = {9,8,7,6,5,4,3,2,1};
vector<int> myvector (5);
// using default comparison (operator <):
partial_sort_copy (myints, myints+9, myvector.begin(), myvector.end());
// using function as comp
partial_sort_copy (myints, myints+9, myvector.begin(), myvector.end(), myfunction);
// print out content:
cout << "myvector contains:";
for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
cout << ' ' << *it;
cout << '\n';
return 0;
}
輸出:
myvector contains:1 2 3 4 5
例子2
讓我們看看默認版本的另一個簡單示例:
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std ;
int main()
{
const int VECTOR_SIZE = 8 ;
// Define a template class vector of int
typedef vector<int> IntVector ;
//Define an iterator for template class vector of strings
typedef IntVector::iterator IntVectorIt ;
IntVector Numbers(VECTOR_SIZE) ;
IntVector Result(4) ;
IntVectorIt start, end, it ;
// Initialize vector Numbers
Numbers[0] = 4 ;
Numbers[1] = 10;
Numbers[2] = 70 ;
Numbers[3] = 30 ;
Numbers[4] = 10;
Numbers[5] = 69 ;
Numbers[6] = 96 ;
Numbers[7] = 7;
start = Numbers.begin() ; // location of first
// element of Numbers
end = Numbers.end() ; // one past the location
// last element of Numbers
cout << "Before calling partial_sort_copy\n" << endl ;
// print content of Numbers
cout << "Numbers { " ;
for(it = start; it != end; it++)
cout << *it << " " ;
cout << " }\n" << endl ;
// sort the smallest 4 elements in the Numbers
// and copy the results in Result
partial_sort_copy(start, end, Result.begin(), Result.end()) ;
cout << "After calling partial_sort_copy\n" << endl ;
cout << "Numbers { " ;
for(it = start; it != end; it++)
cout << *it << " " ;
cout << " }\n" << endl ;
cout << "Result { " ;
for(it = Result.begin(); it != Result.end(); it++)
cout << *it << " " ;
cout << " }\n" << endl ;
return 0;
}
輸出:
Before calling partial_sort_copy Numbers { 4 10 70 30 10 69 96 7 } After calling partial_sort_copy Numbers { 4 10 70 30 10 69 96 7 } Result { 4 7 10 10 }
例子3
讓我們看一個自定義(謂詞)版本的簡單示例:
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std ;
int main()
{
const int VECTOR_SIZE = 8 ;
// Define a template class vector of int
typedef vector<int> IntVector ;
//Define an iterator for template class vector of strings
typedef IntVector::iterator IntVectorIt ;
IntVector Numbers(VECTOR_SIZE) ;
IntVector Result(4) ;
IntVectorIt start, end, it ;
// Initialize vector Numbers
Numbers[0] = 4 ;
Numbers[1] = 10;
Numbers[2] = 70 ;
Numbers[3] = 30 ;
Numbers[4] = 10;
Numbers[5] = 69 ;
Numbers[6] = 96 ;
Numbers[7] = 7;
start = Numbers.begin() ; // location of first
// element of Numbers
end = Numbers.end() ; // one past the location
// last element of Numbers
cout << "Before calling partial_sort_copy\n" << endl ;
// print content of Numbers
cout << "Numbers { " ;
for(it = start; it != end; it++)
cout << *it << " " ;
cout << " }\n" << endl ;
// sort the smallest 4 elements in the Numbers
// and copy the results in Result
partial_sort_copy(start, end, Result.begin(),Result.end(),less<int>());
cout << "After calling partial_sort_copy\n" << endl ;
cout << "Numbers { " ;
for(it = start; it != end; it++)
cout << *it << " " ;
cout << " }\n" << endl ;
cout << "Result { " ;
for(it = Result.begin(); it != Result.end(); it++)
cout << *it << " " ;
cout << " }\n" << endl ;
return 0;
}
輸出:
Before calling partial_sort_copy Numbers { 4 10 70 30 10 69 96 7 } After calling partial_sort_copy Numbers { 4 10 70 30 10 69 96 7 } Result { 4 7 10 10 }
示例 4
讓我們看另一個例子:
#include <algorithm>
#include <vector>
#include <functional>
#include <iostream>
using namespace std;
vector<int>::iterator it;
void print(vector<int> & v)
{
for (it = v.begin(); it != v.end(); it++) {
cout << *it << ' ';
}
cout << '\n';
}
int main()
{
vector<int> v0{4, 2, 5, 1, 3};
vector<int> v1{10, 11, 12};
vector<int> v2{10, 11, 12, 13, 14, 15, 16};
cout << "v0:";
print(v0);
cout << "v1:";
print(v1);
cout << "v2:";
print(v2);
it = partial_sort_copy(v0.begin(), v0.end(), v1.begin(), v1.end());
cout << "Writing v0 to v1 in ascending order gives:";
print(v1);
it = partial_sort_copy(v0.begin(), v0.end(), v2.begin(), v2.end(),
std::greater<int>());
cout << "Writing v0 to v2 in descending order gives:";
print(v2);
return 0;
}
輸出:
v0:4 2 5 1 3 v1:10 11 12 v2:10 11 12 13 14 15 16 Writing v0 to v1 in ascending order gives:1 2 3 Writing v0 to v2 in descending order gives:5 4 3 2 1 15 16
相關用法
- C++ Algorithm partial_sort()用法及代碼示例
- C++ Algorithm partition()用法及代碼示例
- C++ Algorithm partition_copy()用法及代碼示例
- C++ Algorithm partition_point()用法及代碼示例
- C++ Algorithm pop_heap()用法及代碼示例
- C++ Algorithm prev_permutation()用法及代碼示例
- 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 replace()用法及代碼示例
- C++ Algorithm set_intersection()用法及代碼示例
- C++ Algorithm lower_bound()用法及代碼示例
- C++ Algorithm transform()用法及代碼示例
- C++ Algorithm set_difference()用法及代碼示例
注:本文由純淨天空篩選整理自 C++ Algorithm partial_sort_copy()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。