儒雅的核桃 · RxJava2.x实现定时器的方法_rxja ...· 1 月前 · |
潇洒的硬币 · Java一分钟之-Spring Boot ...· 4 月前 · |
逃跑的灭火器 · SQL如何提取字符串中的中文和数字?-阿里云 ...· 1 年前 · |
胆小的排球 · 卧槽,SpringBoot内存泄露,排查竟这 ...· 1 年前 · |
闯红灯的大象 · 安卓:如何检测蓝牙连接状态· 1 年前 · |
last vector const 迭代器 |
https://learn.microsoft.com/zh-tw/cpp/standard-library/algorithm-functions?view=msvc-170 |
完美的充值卡
1 月前 |
first
正向反覆運算器,位於要搜尋之範圍中第一個專案的位置。
二元述詞提供所搜尋的範圍中相鄰元素的值要符合的條件。
指向相鄰元素的第一個正向反覆運算器,這些元素要麼等於彼此(在第一個版本中),或滿足二元述詞(在第二個版本中)所提供的條件,如果找到這類專案組。 否則則是指向
last
的迭代器。
adjacent_find
演算法是非變化的序列演算法。 要搜尋的範圍必須有效。 所有指標都必須可取值,而且最後一個位置必須透過遞增從第一個位置觸達。 演算法的時間複雜性,在範圍內包含的元素數目中是線性。
operator==
用來決定元素間的比對,是否必須施加其運算元之間的對等關聯。
// alg_adj_fnd.cpp
// compile with: /EHsc
#include <list>
#include <algorithm>
#include <iostream>
// Returns whether second element is twice the first
bool twice (int elem1, int elem2 )
return elem1 * 2 == elem2;
int main()
using namespace std;
list<int> L;
list<int>::iterator Iter;
list<int>::iterator result1, result2;
L.push_back( 50 );
L.push_back( 40 );
L.push_back( 10 );
L.push_back( 20 );
L.push_back( 20 );
cout << "L = ( " ;
for ( Iter = L.begin( ) ; Iter != L.end( ) ; Iter++ )
cout << *Iter << " ";
cout << ")" << endl;
result1 = adjacent_find( L.begin( ), L.end( ) );
if ( result1 == L.end( ) )
cout << "There are not two adjacent elements that are equal."
<< endl;
cout << "There are two adjacent elements that are equal.\n"
<< "They have a value of "
<< *( result1 ) << "." << endl;
result2 = adjacent_find( L.begin( ), L.end( ), twice );
if ( result2 == L.end( ) )
cout << "There are not two adjacent elements where the "
<< "second is twice the first." << endl;
cout << "There are two adjacent elements where "
<< "the second is twice the first.\n"
<< "They have values of " << *(result2++)
<< " & " << *result2 << "." << endl;
L = ( 50 40 10 20 20 )
There are two adjacent elements that are equal.
They have a value of 20.
There are two adjacent elements where the second is twice the first.
They have values of 10 & 20.
all_of
當條件出現在指定的範圍中的每個項目時,傳回 true
。
template<class InputIterator, class UnaryPredicate>
bool all_of(
InputIterator first,
InputIterator last,
UnaryPredicate pred);
template <class ExecutionPolicy, class ForwardIterator, class UnaryPredicate>
bool all_of(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
要使用的執行原則。
first
輸入迭代器,表示開始檢查條件的位置。 某範圍元素的開始迭代器標記。
輸入迭代器,表示檢查條件的某範圍元素結尾。
要測試的條件。 pred
是使用者定義的一元述詞函式物件,可定義所檢查之專案所要滿足的條件。 一元述詞接受單一自變數並傳 true
回 或 false
。
true
如果偵測到指定範圍中的每個項目或範圍是空的,false
則傳回 ,否則傳回 。
針對範圍 [0, last - first)
中的每個 N
,只有在述詞 pred(*(first + N))
是 true
時,這個範本函式才會傳回 true
。
// alg_all_of.cpp
// compile with: /EHsc
#include <list>
#include <algorithm>
#include <iostream>
int main()
using namespace std;
list<int> li { 50, 40, 10, 20, 20 };
list<int>::iterator iter;
cout << "li = ( ";
for (iter = li.begin(); iter != li.end(); iter++)
cout << *iter << " ";
cout << ")" << endl;
// Check if all elements in li are even.
auto is_even = [](int elem){ return !(elem % 2); };
if (all_of(li.begin(), li.end(), is_even))
cout << "All the elements are even numbers.\n";
cout << "Not all the elements are even numbers.\n";
li = ( 50 40 10 20 20 )
All the elements are even numbers.
any_of
當條件出現在指定的項目範圍至少一次時,傳回 true
。
template<class InputIterator, class UnaryPredicate>
bool any_of(
InputIterator first,
InputIterator last,
UnaryPredicate pred);
template <class ExecutionPolicy, class ForwardIterator, class UnaryPredicate>
bool any_of(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
要使用的執行原則。
first
輸入迭代器,表示檢查條件的某範圍元素開始。
輸入迭代器,表示檢查條件的某範圍元素結尾。
要測試的條件。 此測試是由使用者定義的述詞函式物件所提供。 這個述詞定義所測試的元素所要符合的條件。 一元述詞接受單一自變數並傳 true
回 或 false
。
如果在所指出範圍至少偵測到一次條件,則會傳回 true
;如果未曾偵測到條件,則會傳回 false
。
針對下列範圍中的某個 N
,這個範本函式只有在下列情況下才會傳回 true
:
範圍為 [0, last - first)
,而情況是述詞 pred(*(first + N))
為 true。
// alg_any_of.cpp
// compile with: /EHsc
#include <list>
#include <algorithm>
#include <iostream>
int main()
using namespace std;
list<int> li { 51, 41, 11, 21, 20 };
cout << "li = ( ";
for (auto const& el : li)
cout << el << " ";
cout << ")" << endl;
// Check if there's an even element in li.
auto is_even = [](int const elem){ return !(elem % 2); };
if (any_of(li.begin(), li.end(), is_even))
cout << "There's an even element in li.\n";
cout << "There are no even elements in li.\n";
li = ( 51 41 11 21 20 )
There's an even element in li.
binary_search
測試排序範圍中的專案是否等於指定的值,或是在二元述詞所指定的意義上相等的專案。
template<class ForwardIterator, class Type>
bool binary_search(
ForwardIterator first,
ForwardIterator last,
const Type& value);
template<class ForwardIterator, class Type, class BinaryPredicate>
bool binary_search(
ForwardIterator first,
ForwardIterator last,
const Type& value,
BinaryPredicate pred);
first
正向迭代器,其定址要搜尋範圍中第一個元素的位置。
正向迭代器,其定址要搜尋範圍中最後一個元素之後的位置。
value
必要的值,比對元素值或必須符合條件的元素值與二元述詞所指定的元素值。
使用者定義的述詞函式物件,定義一個元素小於另一個元素的意義。 二元述詞會採用兩個引數,並且在符合時傳回 true
,不符合時則傳回 false
。
如果在範圍中找到等於或對等於所指定值的元素,則為 true
;否則為 false
。
參考的排序來源範圍必須有效;所有指標都必須可以取值,而且在序列中,必須可透過遞增從第一個位置到達最後一個位置。
排序範圍必須根據 binary_search
演算法用來排序結合範圍的相同順序,排列成套用此演算法的前置條件。
來源範圍不會由 binary_search
修改。
正向反覆運算器的實值型別必須小於可比較的排序。 也就是說,假設有兩個元素,您可以判斷一個小於另一個元素,或者它們相等。 (這裡,對等表示兩者都不小於另一個。此比較會產生無等價專案之間的順序。
演算法的複雜度是隨機存取反覆運算器的對數,否則為線性,步驟數目與 (last-first
) 成正比。
// alg_bin_srch.cpp
// compile with: /EHsc
#include <list>
#include <vector>
#include <algorithm>
#include <functional> // greater<int>( )
#include <iostream>
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser( int elem1, int elem2 )
if (elem1 < 0)
elem1 = - elem1;
if (elem2 < 0)
elem2 = - elem2;
return elem1 < elem2;
int main()
using namespace std;
list<int> List1;
List1.push_back( 50 );
List1.push_back( 10 );
List1.push_back( 30 );
List1.push_back( 20 );
List1.push_back( 25 );
List1.push_back( 5 );
List1.sort();
cout << "List1 = ( " ;
for ( auto Iter : List1 )
cout << Iter << " ";
cout << ")" << endl;
// default binary search for 10
if ( binary_search(List1.begin(), List1.end(), 10) )
cout << "There is an element in list List1 with a value equal to 10."
<< endl;
cout << "There is no element in list List1 with a value equal to 10."
<< endl;
// a binary_search under the binary predicate greater
List1.sort(greater<int>());
if ( binary_search(List1.begin(), List1.end(), 10, greater<int>()) )
cout << "There is an element in list List1 with a value greater than 10 "
<< "under greater than." << endl;
cout << "No element in list List1 with a value greater than 10 "
<< "under greater than." << endl;
// a binary_search under the user-defined binary predicate mod_lesser
vector<int> v1;
for ( auto i = -2; i <= 4; ++i )
v1.push_back(i);
sort(v1.begin(), v1.end(), mod_lesser);
cout << "Ordered using mod_lesser, vector v1 = ( " ;
for ( auto Iter : v1 )
cout << Iter << " ";
cout << ")" << endl;
if ( binary_search(v1.begin(), v1.end(), -3, mod_lesser) )
cout << "There is an element with a value equivalent to -3 "
<< "under mod_lesser." << endl;
cout << "There is not an element with a value equivalent to -3 "
<< "under mod_lesser." << endl;
List1 = ( 5 10 20 25 30 50 )
There is an element in list List1 with a value equal to 10.
There is an element in list List1 with a value greater than 10 under greater than.
Ordered using mod_lesser, vector v1 = ( 0 -1 1 -2 2 3 4 )
There is an element with a value equivalent to -3 under mod_lesser.
clamp
比較值與上限和下限,如果值介於界限之間,則傳回值的參考;如果值分別高於或低於值,則傳回值上限或下限的參考。
template<class Type>
constexpr const Type& clamp(
const Type& value,
const Type& lower,
const Type& upper);
template<class Type, class Compare>
constexpr const Type& clamp(
const Type& value,
const Type& lower,
const Type& upper,
Compare pred);
value
要與 和lower
比較upper
的值。
lower
要夾住 value
的值下限。
upper
要夾住 value
的值上限。
用來比較 value
lower
或 upper
的述詞。 比較述詞會採用兩個自變數,如果第一個自變數在某種意義上小於第二個自變數,則傳回 ,否則傳回 true
。 false
如果 value < lower
傳回 的lower
參考,則傳回 的參考,如果 upper < value
為 ,則傳回 的upper
參考。 否則,它會傳回 的 value
參考。
如果 upper
小於 lower
,則行為未定義。
從來源範圍將項目的值指定到目的範圍,逐一查看項目的來源序列,並以正向方向指派它們新位置。
template<class InputIterator, class OutputIterator>
OutputIterator copy(
InputIterator first,
InputIterator last,
OutputIterator destBeg);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 copy(
ExecutionPolicy&& exec,
ForwardIterator1 first,
ForwardIterator1 last,
ForwardIterator2 result);
要使用的執行原則。
first
輸入迭代器,在來源範圍的第一個項目位置定址。
輸入迭代器,用於定址來源範圍中最後一個項目的後面一個位置。
destBeg
輸出迭代器,用於定址目的範圍中第一個項目的位置。
輸出反覆運算器,尋址目的地範圍中最後一個項目之後的位置,也就是反覆運算器位址 result
+ ( - last
first
)。
來源範圍必須是有效的,而且必須在目的端有足夠的空間保留所有項目的複本。
由於演算法會依序從第一個專案開始複製來源元素,因此目的範圍可以與來源範圍重疊,前提是 last
來源範圍的位置不包含在目的範圍中。 copy
除非來源和目的地範圍之間沒有重疊,否則可以用來將元素向左移,但不能向右移位。 若要向右移位任意數目的位置,請使用 copy_backward
演算法。
copy
演算法只修改迭代器指向的值,並指派新值給目的範圍的項目。 它無法用來建立新元素,而且無法直接將元素插入空白容器中。
// alg_copy.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
using namespace std;
vector<int> v1, v2;
vector<int>::iterator Iter1, Iter2;
int i;
for ( i = 0 ; i <= 5 ; i++ )
v1.push_back( 10 * i );
int ii;
for ( ii = 0 ; ii <= 10 ; ii++ )
v2.push_back( 3 * ii );
cout << "v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
cout << "v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
// To copy the first 3 elements of v1 into the middle of v2
copy( v1.begin( ), v1.begin( ) + 3, v2.begin( ) + 4 );
cout << "v2 with v1 insert = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
// To shift the elements inserted into v2 two positions
// to the left
copy( v2.begin( )+4, v2.begin( ) + 7, v2.begin( ) + 2 );
cout << "v2 with shifted insert = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
v1 = ( 0 10 20 30 40 50 )
v2 = ( 0 3 6 9 12 15 18 21 24 27 30 )
v2 with v1 insert = ( 0 3 6 9 0 10 20 21 24 27 30 )
v2 with shifted insert = ( 0 3 0 10 20 10 20 21 24 27 30 )
copy_backward
從來源範圍將項目的值指定到目的範圍,逐一查看項目的來源序列,並以反向方向指派它們新位置。
template<class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2 copy_backward(
BidirectionalIterator1 first,
BidirectionalIterator1 last,
BidirectionalIterator2 destEnd);
first
雙向迭代器,在來源範圍的第一個項目位置定址。
雙向迭代器,在來源範圍中越過最後一個項目的位置定址。
destEnd
雙向迭代器,在目的範圍中越過最後一個項目的位置定址。
輸出反覆運算器,尋址目的地範圍中最後一個項目之後的位置,也就是反覆運算器尋址 destEnd - (last - first)
。
來源範圍必須是有效的,而且必須在目的端有足夠的空間保留所有項目的複本。
此 copy_backward
演算法會強加比 copy
演算法更嚴格的需求。 其輸入和輸出迭代器必須是雙向的。
copy_backward
和 move_backward
演算法是唯一C++標準連結庫演算法,指定輸出範圍,且反覆運算器指向目的地範圍的結尾。
由於演算法會依序複製來源元素,從最後一個項目開始,目的範圍可以與來源範圍重疊,前提是 first
來源範圍的位置不包含在目的範圍中。 copy_backward
除非來源和目的地範圍之間沒有重疊,否則可以用來將元素向右移動,但不能向左移位。 若要向左移位任意數目的位置,請使用 copy
演算法。
copy_backward
演算法只修改迭代器指向的值,並指派新值給目的範圍的項目。 它無法用來建立新元素,而且無法直接將元素插入空白容器中。
// alg_copy_bkwd.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
using namespace std;
vector<int> v1, v2;
vector<int>::iterator Iter1, Iter2;
int i;
for ( i = 0 ; i <= 5 ; ++i )
v1.push_back( 10 * i );
int ii;
for ( ii = 0 ; ii <= 10 ; ++ii )
v2.push_back( 3 * ii );
cout << "v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; ++Iter1 )
cout << *Iter1 << " ";
cout << ")" << endl;
cout << "v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; ++Iter2 )
cout << *Iter2 << " ";
cout << ")" << endl;
// To copy_backward the first 3 elements of v1 into the middle of v2
copy_backward( v1.begin( ), v1.begin( ) + 3, v2.begin( ) + 7 );
cout << "v2 with v1 insert = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; ++Iter2 )
cout << *Iter2 << " ";
cout << ")" << endl;
// To shift the elements inserted into v2 two positions
// to the right
copy_backward( v2.begin( )+4, v2.begin( ) + 7, v2.begin( ) + 9 );
cout << "v2 with shifted insert = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; ++Iter2 )
cout << *Iter2 << " ";
cout << ")" << endl;
v1 = ( 0 10 20 30 40 50 )
v2 = ( 0 3 6 9 12 15 18 21 24 27 30 )
v2 with v1 insert = ( 0 3 6 9 0 10 20 21 24 27 30 )
v2 with shifted insert = ( 0 3 6 9 0 10 0 10 20 27 30 )
copy_if
在某範圍的元素中,複製所指定條件為 true
的元素。
template<class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator copy_if(
InputIterator first,
InputIterator last,
OutputIterator dest,
UnaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class UnaryPredicate>
ForwardIterator2 copy_if(
ExecutionPolicy&& exec,
ForwardIterator1 first,
ForwardIterator1 last,
ForwardIterator2 result,
UnaryPredicate pred);
要使用的執行原則。
first
輸入迭代器,表示檢查條件的範圍開始。
輸入迭代器,表示範圍的結尾。
輸出迭代器,表示所複製元素的目的地。
測試範圍中每個元素的條件。 這種條件是由使用者定義的述詞函式物件所提供。 一元述詞接受一個自變數,並傳 true
回 或 false
。
輸出迭代器,等於可滿足條件的每個元素都會遞增一次的 dest
。 換句話說,傳回值減去 dest
等於所複製元素數。
範本函式會針對下列項目評估一次:
if (pred(*first + N)) * dest++ = *(first + N))
範圍 [0, last - first)
中的每個 N
,才能嚴格地從最低值開始增加 N
值。 如果 dest
和 first
指定儲存區域,dest
不得在範圍 [ first, last )
內。
// alg_copy_if.cpp
// compile with: /EHsc
#include <list>
#include <algorithm>
#include <iostream>
void listlist(std::list<int> l)
std::cout << "( ";
for (auto const& el : l)
std::cout << el << " ";
std::cout << ")" << std::endl;
int main()
using namespace std;
list<int> li{ 46, 59, 88, 72, 79, 71, 60, 5, 40, 84 };
list<int> le(li.size()); // le = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
list<int> lo(li.size()); // lo = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
cout << "li = ";
listlist(li);
// is_even checks if the element is even.
auto is_even = [](int const elem) { return !(elem % 2); };
// use copy_if to select only even elements from li
// and copy them to le, starting from le's begin position
auto ec = copy_if(li.begin(),li.end(), le.begin(), is_even);
le.resize(std::distance(le.begin(), ec)); // shrink le to new size
cout << "Even numbers are le = ";
listlist(le);
// is_odd checks if the element is odd.
auto is_odd = [](int const elem) { return (elem % 2); };
// use copy_if to select only odd elements from li
// and copy them to lo, starting from lo's begin position
auto oc = copy_if(li.begin(), li.end(), lo.begin(), is_odd);
lo.resize(std::distance(lo.begin(), oc)); // shrink lo to new size
cout << "Odd numbers are lo = ";
listlist(lo);
li = ( 46 59 88 72 79 71 60 5 40 84 )
Even numbers are le = ( 46 88 72 60 40 84 )
Odd numbers are lo = ( 59 79 71 5 )
copy_n
複製指定的項目數目。
template<class InputIterator, class Size, class OutputIterator>
OutputIterator copy_n(
InputIterator first,
Size count,
OutputIterator dest);
template<class ExecutionPolicy, class ForwardIterator1, class Size, class ForwardIterator2>
ForwardIterator2 copy_n(
ExecutionPolicy&& exec,
ForwardIterator1 first,
Size count,
ForwardIterator2 dest);
要使用的執行原則。
first
輸入迭代器,表示要複製元素的位置。
count
帶正負號或不帶正負號的整數類型,指定要複製的元素數目。
輸出迭代器,表示要將元素複製過去的位置。
傳回輸出迭代器,其中已將元素複製過去。 與參數傳 dest
回的值相同。
這個範本函式會針對範圍 [0, count)
中的每個 N
評估一次 *(dest + N) = *(first + N))
,才能嚴格地從最低值開始增加 N
值。 然後它會傳回 dest + N
。 如果 dest
和 first
指定儲存區域,dest
不得在範圍 [first, last)
內。
// alg_copy_n.cpp
// compile with: cl /EHsc /W4 alg_copy_n.cpp
#include <algorithm>
#include <iostream>
#include <string>
int main()
using namespace std;
string s1{"dandelion"};
string s2{"badger"};
cout << s1 << " + " << s2 << " = ";
// Copy the first 3 letters from s1
// to the first 3 positions in s2
copy_n(s1.begin(), 3, s2.begin());
cout << s2 << endl;
dandelion + badger = danger
count
傳回範圍中值符合指定值的項目數目。
template<class InputIterator, class Type>
typename iterator_traits<InputIterator>::difference_type count(
InputIterator first,
InputIterator last,
const Type& value);
template<class ExecutionPolicy, class ForwardIterator, class Type>
typename iterator_traits<ForwardIterator>::difference_type
count(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
const Type& value);
要使用的執行原則。
first
輸入迭代器,定址要周遊範圍中第一個元素的位置。
輸入迭代器,定址要周遊範圍中最後一個元素之後的位置。
value
要計算之元素的值。
的差異型 InputIterator
別,會計算範圍 [first
, last
] 中具有值 value
的項目數。
operator==
用來決定元素及指定值間的比對,是否必須施加其運算元之間的等價關聯。
此演算法會一般化來計算滿足樣板函 count_if
式 之任何述詞的專案。
// alg_count.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main()
using namespace std;
vector<int> v1;
vector<int>::iterator Iter;
v1.push_back(10);
v1.push_back(20);
v1.push_back(10);
v1.push_back(40);
v1.push_back(10);
cout << "v1 = ( " ;
for (Iter = v1.begin(); Iter != v1.end(); Iter++)
cout << *Iter << " ";
cout << ")" << endl;
vector<int>::iterator::difference_type result;
result = count(v1.begin(), v1.end(), 10);
cout << "The number of 10s in v2 is: " << result << "." << endl;
v1 = ( 10 20 10 40 10 )
The number of 10s in v2 is: 3.
count_if
傳回範圍中值符合指定條件的元素數。
template<class InputIterator, class UnaryPredicate>
typename iterator_traits<InputIterator>::difference_type count_if(
InputIterator first,
InputIterator last,
UnaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator, class UnaryPredicate>
typename iterator_traits<ForwardIterator>::difference_type
count_if(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
要使用的執行原則。
first
輸入迭代器,其定址要搜尋範圍中第一個元素的位置。
輸入迭代器,其定址要搜尋範圍中最後一個元素之後的位置。
使用者定義的述詞函式物件,定義計算元素時所要符合的條件。 一元述詞接受單一自變數並傳 true
回 或 false
。
符合此述詞所指定條件的元素數。
此範本函式是演算法 count
的一般化,以任何述詞取代述詞「等於特定值」。
// alg_count_if.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
bool greater10(int value)
return value > 10;
int main()
using namespace std;
vector<int> v1;
vector<int>::iterator Iter;
v1.push_back(10);
v1.push_back(20);
v1.push_back(10);
v1.push_back(40);
v1.push_back(10);
cout << "v1 = ( ";
for (Iter = v1.begin(); Iter != v1.end(); Iter++)
cout << *Iter << " ";
cout << ")" << endl;
vector<int>::iterator::difference_type result1;
result1 = count_if(v1.begin(), v1.end(), greater10);
cout << "The number of elements in v1 greater than 10 is: "
<< result1 << "." << endl;
v1 = ( 10 20 10 40 10 )
The number of elements in v1 greater than 10 is: 2.
equal
逐一比較兩個範圍的每個項目是否相等 (或在二元述詞指定的意義上,是否對等)。
在比較不同容器類型中的專案時,vector
list
或比較不同的項目類型,或當您需要比較容器子範圍時,請使用 std::equal
。 否則,在比較相同容器類型中相同類型的元素時,請使用提供給每個容器的非成員 operator==
。
使用 C++14 程式代碼中的雙範圍多載,因為如果第二個範圍超過第一個範圍,則只有單一反覆運算器的多載不會偵測到差異。 如果第二個範圍比第一個範圍短,這些多載將會導致未定義的行為。
template<class InputIterator1, class InputIterator2>
bool equal(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2);
template<class InputIterator1, class InputIterator2, class BinaryPredicate>
bool equal(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
BinaryPredicate pred); // C++14
template<class InputIterator1, class InputIterator2>
bool equal(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2);
template<class InputIterator1, class InputIterator2, class BinaryPredicate>
bool equal(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
BinaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
bool equal(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
bool equal(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
BinaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
bool equal(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
bool equal(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred);
要使用的執行原則。
first1
輸入迭代器,定址要測試的第一個範圍中第一個項目的位置。
last1
輸入迭代器,定址要測試的第一個範圍中最後一個項目的後面一個位置。
first2
輸入迭代器,定址要測試的第二個範圍中第一個項目的位置。
last2
輸入迭代器,定址要測試的第二個範圍中最後一個項目的後面一個位置。
使用者定義的述詞函式物件,定義要接受兩個元素為對等時所要符合的條件。 二元述詞會採用兩個引數,並且在符合時傳回 true
,不符合時則傳回 false
。
true
如果 和 只有在項目比較專案時,二元述詞下的範圍相同或相等,則為 ;否則為 false
。
要搜尋的範圍必須有效;所有迭代器都必須可以取值,而且可透過遞增從第一個位置到達最後一個位置。
如果兩個範圍有相等的長度,則演算法的時間複雜性,在範圍包含的項目數目中是線性。 否則函式立即傳回 false
。
您不需要 operator==
或使用者定義的述詞來強加對稱、反射和可轉移其操作數之間的等價關聯性。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
vector<int> v1 { 0, 5, 10, 15, 20, 25 };
vector<int> v2 { 0, 5, 10, 15, 20, 25 };
vector<int> v3 { 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 };
// Using range-and-a-half equal:
bool b = equal(v1.begin(), v1.end(), v2.begin());
cout << "v1 and v2 are equal: "
<< b << endl; // true, as expected
b = equal(v1.begin(), v1.end(), v3.begin());
cout << "v1 and v3 are equal: "
<< b << endl; // true, surprisingly
// Using dual-range equal:
b = equal(v1.begin(), v1.end(), v3.begin(), v3.end());
cout << "v1 and v3 are equal with dual-range overload: "
<< b << endl; // false
return 0;
v1 and v2 are equal: 1
v1 and v3 are equal: 1
v1 and v3 are equal with dual-range overload: 0
equal_range
如果提供排序範圍,則會尋找所有元素都等於指定值的子範圍。
template<class ForwardIterator, class Type>
pair<ForwardIterator, ForwardIterator> equal_range(
ForwardIterator first,
ForwardIterator last,
const Type& value);
template<class ForwardIterator, class Type, class Compare>
pair<ForwardIterator, ForwardIterator> equal_range(
ForwardIterator first,
ForwardIterator last,
const Type& value,
Compare pred);
first
正向迭代器,其定址要搜尋範圍中第一個元素的位置。
正向迭代器,其定址要搜尋範圍中最後一個元素之後的位置。
value
排序範圍中要搜尋的值。
使用者定義的述詞函式物件,定義一個元素小於另一個元素的意義。 比較述詞會採用兩個自變數,並在滿足時和false
未滿足時傳回 true
。
一對正向迭代器,指定包含在所搜尋範圍內的子範圍,其中,所有元素都等於意義中所使用二元述詞所定義的 value
(pred
或預設值:小於)。
如果範圍中沒有任何專案相等 value
,則傳回配對中的正向反覆運算器相等,並指定可以插入的位置點 value
,而不會干擾範圍的順序。
演演算法傳回之配對的第一個反覆運算器是 lower_bound
,而第二個反覆運算器是 upper_bound
。
範圍必須根據提供給 equal_range
的述詞來進行排序。 例如,如果您要使用大於述詞,範圍必須以遞減順序排序。
所傳回 equal_range
之反覆運算器配對所定義之可能空白子範圍中的元素,相當於 所使用述詞所定義之意義中的值 。
演算法的複雜度是隨機存取反覆運算器的對數,否則為線性,步驟數目與 (last
- first
) 成正比。
// alg_equal_range.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // greater<int>()
#include <iostream>
#include <string>
using namespace std;
template<class T> void dump_vector( const vector<T>& v, pair<typename vector<T>::iterator, typename vector<T>::iterator> range )
// prints vector v with range delimited by [ and ]
for ( typename vector<T>::const_iterator i = v.begin(); i != v.end(); ++i )
if ( i == range.first )
cout << "[ ";
if ( i == range.second )
cout << "] ";
cout << *i << " ";
cout << endl;
template<class T> void equal_range_demo( const vector<T>& original_vector, T value )
vector<T> v(original_vector);
sort( v.begin(), v.end() );
cout << "Vector sorted by the default binary predicate <:" << endl << '\t';
for ( typename vector<T>::const_iterator i = v.begin(); i != v.end(); ++i )
cout << *i << " ";
cout << endl << endl;
pair<typename vector<T>::iterator, typename vector<T>::iterator> result
= equal_range( v.begin(), v.end(), value );
cout << "Result of equal_range with value = " << value << ":" << endl << '\t';
dump_vector( v, result );
cout << endl;
template<class T, class F> void equal_range_demo( const vector<T>& original_vector, T value, F pred, string predname )
vector<T> v(original_vector);
sort( v.begin(), v.end(), pred );
cout << "Vector sorted by the binary predicate " << predname << ":" << endl << '\t';
for ( typename vector<T>::const_iterator i = v.begin(); i != v.end(); ++i )
cout << *i << " ";
cout << endl << endl;
pair<typename vector<T>::iterator, typename vector<T>::iterator> result
= equal_range( v.begin(), v.end(), value, pred );
cout << "Result of equal_range with value = " << value << ":" << endl << '\t';
dump_vector( v, result );
cout << endl;
// Return whether absolute value of elem1 is less than absolute value of elem2
bool abs_lesser( int elem1, int elem2 )
return abs(elem1) < abs(elem2);
// Return whether string l is shorter than string r
bool shorter_than(const string& l, const string& r)
return l.size() < r.size();
int main()
vector<int> v1;
// Constructing vector v1 with default less than ordering
for ( int i = -1; i <= 4; ++i )
v1.push_back(i);
for ( int i =-3; i <= 0; ++i )
v1.push_back( i );
equal_range_demo( v1, 3 );
equal_range_demo( v1, 3, greater<int>(), "greater" );
equal_range_demo( v1, 3, abs_lesser, "abs_lesser" );
vector<string> v2;
v2.push_back("cute");
v2.push_back("fluffy");
v2.push_back("kittens");
v2.push_back("fun");
v2.push_back("meowmeowmeow");
v2.push_back("blah");
equal_range_demo<string>( v2, "fred" );
equal_range_demo<string>( v2, "fred", shorter_than, "shorter_than" );
Vector sorted by the default binary predicate <:
-3 -2 -1 -1 0 0 1 2 3 4
Result of equal_range with value = 3:
-3 -2 -1 -1 0 0 1 2 [ 3 ] 4
Vector sorted by the binary predicate greater:
4 3 2 1 0 0 -1 -1 -2 -3
Result of equal_range with value = 3:
4 [ 3 ] 2 1 0 0 -1 -1 -2 -3
Vector sorted by the binary predicate abs_lesser:
0 0 -1 1 -1 2 -2 3 -3 4
Result of equal_range with value = 3:
0 0 -1 1 -1 2 -2 [ 3 -3 ] 4
Vector sorted by the default binary predicate <:
blah cute fluffy fun kittens meowmeowmeow
Result of equal_range with value = fred:
blah cute fluffy [ ] fun kittens meowmeowmeow
Vector sorted by the binary predicate shorter_than:
fun cute blah fluffy kittens meowmeowmeow
Result of equal_range with value = fred:
fun [ cute blah ] fluffy kittens meowmeowmeow
將相同的新值指派到指定範圍內的每個項目。
template<class ForwardIterator, class Type>
void fill(
ForwardIterator first,
ForwardIterator last,
const Type& value);
template<class ExecutionPolicy, class ForwardIterator, class Type>
void fill(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
const Type& value);
要使用的執行原則。
first
正向迭代器,定址要周遊之範圍中第一個元素的位置。
正向迭代器,定址要周遊之範圍中最後一個元素之後的位置。
value
要指派給範圍 [first
, last
的專案] 的值。
目的範圍必須有效;所有指標都必須可以取值,而且可透過遞增從第一個位置到達最後一個位置。 複雜度是具有範圍大小的線性。
// alg_fill.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main()
using namespace std;
vector<int> v1;
vector<int>::iterator Iter1;
int i;
for ( i = 0 ; i <= 9 ; i++ )
v1.push_back( 5 * i );
cout << "Vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// Fill the last 5 positions with a value of 2
fill( v1.begin( ) + 5, v1.end( ), 2 );
cout << "Modified v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
Vector v1 = ( 0 5 10 15 20 25 30 35 40 45 )
Modified v1 = ( 0 5 10 15 20 2 2 2 2 2 )
fill_n
將新值指派給範圍中以特定元素開頭的指定元素數目。
template<class OutputIterator, class Size, class Type>
OutputIterator fill_n(
OutputIterator first,
Size count,
const Type& value);
template<class ExecutionPolicy, class ForwardIterator, class Size, class Type>
ForwardIterator fill_n(
ExecutionPolicy&& exec,
ForwardIterator first,
Size count,
const Type& value);
要使用的執行原則。
first
輸出迭代器,定址要指派值 value
之範圍中第一個元素的位置。
count
帶正負號或不帶正負號的整數類型,指定要獲指派值的元素數目。
value
要指派給範圍 [first
, first + count
的專案] 的值。
在最後一個專案後面填入 count
> 零的元素反覆運算器,否則為第一個專案。
目的範圍必須有效;所有指標都必須可以取值,而且可透過遞增從第一個位置到達最後一個位置。 複雜度是具有範圍大小的線性。
// alg_fill_n.cpp
// compile using /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
int main()
using namespace std;
vector<int> v;
for ( auto i = 0 ; i < 9 ; ++i )
v.push_back( 0 );
cout << "vector v = ( " ;
for ( const auto &w : v )
cout << w << " ";
cout << ")" << endl;
// Fill the first 3 positions with a value of 1, saving position.
auto pos = fill_n( v.begin(), 3, 1 );
cout << "modified v = ( " ;
for ( const auto &w : v )
cout << w << " ";
cout << ")" << endl;
// Fill the next 3 positions with a value of 2, using last position.
fill_n( pos, 3, 2 );
cout << "modified v = ( " ;
for ( const auto &w : v )
cout << w << " ";
cout << ")" << endl;
// Fill the last 3 positions with a value of 3, using relative math.
fill_n( v.end()-3, 3, 3 );
cout << "modified v = ( " ;
for ( const auto &w : v )
cout << w << " ";
cout << ")" << endl;
vector v = ( 0 0 0 0 0 0 0 0 0 )
modified v = ( 1 1 1 0 0 0 0 0 0 )
modified v = ( 1 1 1 2 2 2 0 0 0 )
modified v = ( 1 1 1 2 2 2 3 3 3 )
在範圍中找出有指定值的第一個項目的位置。
template<class InputIterator, class Type>
InputIterator find(
InputIterator first,
InputIterator last,
const Type& value);
template<class ExecutionPolicy, class ForwardIterator, class Type>
ForwardIterator find(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
const Type& value);
要使用的執行原則。
first
輸入迭代器,其定址要搜尋指定值的範圍中,第一個元素的位置。
輸入迭代器,其定址要搜尋指定值的範圍中,最後一個元素後方的位置。
value
要搜尋的值。
輸入迭代器,其定址所搜尋的範圍中第一次出現的指定值。 如果找不到具有相等值的任何元素,會傳回 last
。
operator==
用來決定元素及指定值間的比對,是否必須施加其運算元之間的等價關聯。
如需使用 find()
的程式代碼範例,請參閱 find_if
。
find_end
在範圍中尋找與指定序列相同 (或在二元述詞指定的意義上,相當於該序列) 的最後一個子序列。
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_end(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ForwardIterator1, class ForwardIterator2, class Pred>
ForwardIterator1 find_end(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
Pred pred);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
ForwardIterator1
find_end(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ExecutionPolicy, class ForwardIterator1,
class ForwardIterator2, class BinaryPredicate>
ForwardIterator1
find_end(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred);
first1
正向迭代器,其定址要搜尋範圍中第一個元素的位置。
last1
正向迭代器,其定址要搜尋範圍中最後一個元素之後的位置。
first2
正向迭代器,其定址要搜尋範圍中第一個元素的位置。
last2
正向迭代器,其定址要搜尋範圍中最後一個元素之後的位置。
使用者定義的述詞函式物件,定義要接受兩個元素為對等時所要符合的條件。 二元述詞會採用兩個引數,並且在符合時傳回 true
,不符合時則傳回 false
。
正向反覆運算器,尋址物件是符合指定序列 [first2, last2] 的 [first1, last1] 中最後一個子序列中第一個專案的位置。
operator==
用來決定元素及指定值間的比對,是否必須施加其運算元之間的等價關聯。
參考的範圍必須有效;所有指標都必須可以取值,而且在每個序列中,可透過遞增從第一個位置到達最後一個位置。
// alg_find_end.cpp
// compile with: /EHsc
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
// Return whether second element is twice the first
bool twice ( int elem1, int elem2 )
return 2 * elem1 == elem2;
int main()
using namespace std;
vector<int> v1, v2;
list<int> L1;
vector<int>::iterator Iter1, Iter2;
list<int>::iterator L1_Iter, L1_inIter;
int i;
for ( i = 0 ; i <= 5 ; i++ )
v1.push_back( 5 * i );
for ( i = 0 ; i <= 5 ; i++ )
v1.push_back( 5 * i );
int ii;
for ( ii = 1 ; ii <= 4 ; ii++ )
L1.push_back( 5 * ii );
int iii;
for ( iii = 2 ; iii <= 4 ; iii++ )
v2.push_back( 10 * iii );
cout << "Vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
cout << "List L1 = ( " ;
for ( L1_Iter = L1.begin( ) ; L1_Iter!= L1.end( ) ; L1_Iter++ )
cout << *L1_Iter << " ";
cout << ")" << endl;
cout << "Vector v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
// Searching v1 for a match to L1 under identity
vector<int>::iterator result1;
result1 = find_end ( v1.begin( ), v1.end( ), L1.begin( ), L1.end( ) );
if ( result1 == v1.end( ) )
cout << "There is no match of L1 in v1."
<< endl;
cout << "There is a match of L1 in v1 that begins at "
<< "position "<< result1 - v1.begin( ) << "." << endl;
// Searching v1 for a match to L1 under the binary predicate twice
vector<int>::iterator result2;
result2 = find_end ( v1.begin( ), v1.end( ), v2.begin( ), v2.end( ), twice );
if ( result2 == v1.end( ) )
cout << "There is no match of L1 in v1."
<< endl;
cout << "There is a sequence of elements in v1 that "
<< "are equivalent to those\n in v2 under the binary "
<< "predicate twice and that begins at position "
<< result2 - v1.begin( ) << "." << endl;
Vector v1 = ( 0 5 10 15 20 25 0 5 10 15 20 25 )
List L1 = ( 5 10 15 20 )
Vector v2 = ( 20 30 40 )
There is a match of L1 in v1 that begins at position 7.
There is a sequence of elements in v1 that are equivalent to those
in v2 under the binary predicate twice and that begins at position 8.
find_first_of
搜尋目標範圍內數個值中第一次出現的任何一個。 或者,在二元述詞所指定的意義上,搜尋第一次出現的數個元素,與一組指定的專案相等。
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_first_of(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
ForwardIterator1 find_first_of(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
ForwardIterator1
find_first_of(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ExecutionPolicy, class ForwardIterator1,
class ForwardIterator2, class BinaryPredicate>
ForwardIterator1
find_first_of(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred);
first1
正向迭代器,其定址要搜尋範圍中第一個元素的位置。
last1
正向迭代器,其定址要搜尋範圍中最後一個元素之後的位置。
first2
正向迭代器,其定址要比對範圍中第一個元素的位置。
last2
正向迭代器,其定址要比對範圍中最後一個元素之後的位置。
使用者定義的述詞函式物件,定義要接受兩個元素為對等時所要符合的條件。 二元述詞會採用兩個引數,並且在符合時傳回 true
,不符合時則傳回 false
。
正向迭代器會定址符合指定序列,或等於二元述詞所指定之意義的第一個子序列的第一個元素的位置。
operator==
用來決定元素及指定值間的比對,是否必須施加其運算元之間的等價關聯。
參考的範圍必須有效;所有指標都必須可以取值,而且在每個序列中,可透過遞增從第一個位置到達最後一個位置。
// alg_find_first_of.cpp
// compile with: /EHsc
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
// Return whether second element is twice the first
bool twice ( int elem1, int elem2 )
return 2 * elem1 == elem2;
int main()
using namespace std;
vector<int> v1, v2;
list<int> L1;
vector<int>::iterator Iter1, Iter2;
list<int>::iterator L1_Iter, L1_inIter;
int i;
for ( i = 0 ; i <= 5 ; i++ )
v1.push_back( 5 * i );
for ( i = 0 ; i <= 5 ; i++ )
v1.push_back( 5 * i );
int ii;
for ( ii = 3 ; ii <= 4 ; ii++ )
L1.push_back( 5 * ii );
int iii;
for ( iii = 2 ; iii <= 4 ; iii++ )
v2.push_back( 10 * iii );
cout << "Vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
cout << "List L1 = ( " ;
for ( L1_Iter = L1.begin( ) ; L1_Iter!= L1.end( ) ; L1_Iter++ )
cout << *L1_Iter << " ";
cout << ")" << endl;
cout << "Vector v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
// Searching v1 for first match to L1 under identity
vector<int>::iterator result1;
result1 = find_first_of ( v1.begin( ), v1.end( ), L1.begin( ), L1.end( ) );
if ( result1 == v1.end( ) )
cout << "There is no match of L1 in v1."
<< endl;
cout << "There is at least one match of L1 in v1"
<< "\n and the first one begins at "
<< "position "<< result1 - v1.begin( ) << "." << endl;
// Searching v1 for a match to L1 under the binary predicate twice
vector<int>::iterator result2;
result2 = find_first_of ( v1.begin( ), v1.end( ), v2.begin( ), v2.end( ), twice );
if ( result2 == v1.end( ) )
cout << "There is no match of L1 in v1."
<< endl;
cout << "There is a sequence of elements in v1 that "
<< "are equivalent\n to those in v2 under the binary "
<< "predicate twice\n and the first one begins at position "
<< result2 - v1.begin( ) << "." << endl;
Vector v1 = ( 0 5 10 15 20 25 0 5 10 15 20 25 )
List L1 = ( 15 20 )
Vector v2 = ( 20 30 40 )
There is at least one match of L1 in v1
and the first one begins at position 3.
There is a sequence of elements in v1 that are equivalent
to those in v2 under the binary predicate twice
and the first one begins at position 2.
find_if
在範圍中找出滿足特定條件的第一個項目的位置。
template<class InputIterator, class UnaryPredicate>
InputIterator find_if(
InputIterator first,
InputIterator last,
UnaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator, class UnaryPredicate>
ForwardIterator find_if(
ExecutionPolicy&& exec,
ForwardIterator first, ForwardIterator last,
UnaryPredicate pred);
first
輸入迭代器,其定址要搜尋範圍中第一個元素的位置。
輸入迭代器,其定址要搜尋範圍中最後一個元素之後的位置。
使用者定義的述詞函式物件或 Lambda 運算式,定義所搜尋的元素所要符合的條件。 一元述詞接受單一自變數,如果滿足,則false
傳回 ;如果不符合則傳回 true
。 pred
的簽章必須有效地 bool pred(const T& arg);
,其中 T
是取值時可隱含轉換 InputIterator
的類型。 只會 const
顯示 關鍵詞,以說明函式物件或 Lambda 不應該修改 自變數。
輸入迭代器,指出與述詞所指定的條件 (述詞產生的 true
) 相符的範圍中的第一個元素。 如果沒有發現任何符合述詞的元素,會傳回 last
。
此範本函式是演算法 find
的一般化,以任何述詞取代述詞「等於特定值」。 如需邏輯相反項目(尋找不符合述詞的第一個專案),請參閱 find_if_not
。
// cl.exe /W4 /nologo /EHsc /MTd
#include <vector>
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
template <typename S> void print(const S& s) {
for (const auto& p : s) {
cout << "(" << p << ") ";
cout << endl;
// Test std::find()
template <class InputIterator, class T>
void find_print_result(InputIterator first, InputIterator last, const T& value) {
// call <algorithm> std::find()
auto p = find(first, last, value);
cout << "value " << value;
if (p == last) {
cout << " not found." << endl;
} else {
cout << " found." << endl;
// Test std::find_if()
template <class InputIterator, class Predicate>
void find_if_print_result(InputIterator first, InputIterator last,
Predicate Pred, const string& Str) {
// call <algorithm> std::find_if()
auto p = find_if(first, last, Pred);
if (p == last) {
cout << Str << " not found." << endl;
} else {
cout << "first " << Str << " found: " << *p << endl;
// Function to use as the UnaryPredicate argument to find_if() in this example
bool is_odd_int(int i) {
return ((i % 2) != 0);
int main()
// Test using a plain old array.
const int x[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
cout << "array x[] contents: ";
print(x);
// Using non-member std::begin()/std::end() to get input iterators for the plain old array.
cout << "Test std::find() with array..." << endl;
find_print_result(begin(x), end(x), 10);
find_print_result(begin(x), end(x), 42);
cout << "Test std::find_if() with array..." << endl;
find_if_print_result(begin(x), end(x), is_odd_int, "odd integer"); // function name
find_if_print_result(begin(x), end(x), // lambda
[](int i){ return ((i % 2) == 0); }, "even integer");
// Test using a vector.
vector<int> v;
for (int i = 0; i < 10; ++i) {
v.push_back((i + 1) * 10);
cout << endl << "vector v contents: ";
print(v);
cout << "Test std::find() with vector..." << endl;
find_print_result(v.begin(), v.end(), 20);
find_print_result(v.begin(), v.end(), 12);
cout << "Test std::find_if() with vector..." << endl;
find_if_print_result(v.begin(), v.end(), is_odd_int, "odd integer");
find_if_print_result(v.begin(), v.end(), // lambda
[](int i){ return ((i % 2) == 0); }, "even integer");
array x[] contents: (1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
Test std::find() with array...
value 10 found.
value 42 not found.
Test std::find_if() with array...
first odd integer found: 1
first even integer found: 2
vector v contents: (10) (20) (30) (40) (50) (60) (70) (80) (90) (100)
Test std::find() with vector...
value 20 found.
value 12 not found.
Test std::find_if() with vector...
odd integer not found.
first even integer found: 10
find_if_not
傳回指定範圍中不符合條件的第一個專案。
template<class InputIterator, class UnaryPredicate>
InputIterator find_if_not(
InputIterator first,
InputIterator last,
UnaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator, class UnaryPredicate>
ForwardIterator find_if_not(
ExecutionPolicy&& exec,
ForwardIterator first, ForwardIterator last,
UnaryPredicate pred);
first
輸入迭代器,其定址要搜尋範圍中第一個元素的位置。
輸入迭代器,其定址要搜尋範圍中最後一個元素之後的位置。
使用者定義的述詞函式物件或 Lambda 運算式,定義所搜尋的元素不符合的條件。 一元述詞接受單一自變數,如果滿足,則false
傳回 ;如果不符合則傳回 true
。 pred
的簽章必須有效地 bool pred(const T& arg);
,其中 T
是取值時可隱含轉換 InputIterator
的類型。 只會 const
顯示 關鍵詞,以說明函式物件或 Lambda 不應該修改 自變數。
輸入反覆運算器,參考範圍中不符合述詞所指定條件的第一個專案(述詞結果為 false
)。 如果所有元素符合述詞 (每個元素的 true
中的述詞結果),會傳回 last
。
此範本函式是演算法 find
的一般化,以任何述詞取代述詞「等於特定值」。 如需邏輯相反項目(尋找滿足述詞的第一個專案),請參閱 find_if
。
如需容易適應 find_if_not()
的程式代碼範例,請參閱 find_if
。
for_each
將指定的函式物件以正向順序套用至範圍內的每個項目,並傳回函式物件。
template<class InputIterator, class Function>
Function for_each(
InputIterator first,
InputIterator last,
Function func);
template<class ExecutionPolicy, class ForwardIterator, class Function>
void for_each(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
Function func);
first
輸入反覆運算器,尋址要操作之範圍中第一個專案的位置。
輸入迭代器,定址要對其作業之範圍中最後一個元素之後的位置。
套用至範圍中每個元素的使用者定義函式物件。
套用至範圍中的所有元素之後的函式物件複本。
此演算法 for_each
具有彈性,允許以不同的使用者指定方式修改某個範圍內的每個元素。 傳遞不同的參數,即可透過修改後的形式重複使用範本化函式。 使用者定義的函式可能會累積內部狀態內的資訊,而演算法可能會在處理範圍中所有元素之後傳回這項資訊。
參考的範圍必須有效;所有指標必須是可取值且在序列中,還必須要可以從第一個位置開始透過增量而取得最後一個位置。
複雜度最多與 (last
- first
) 比較是線性的。
// alg_for_each.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
// The function object multiplies an element by a Factor
template <class Type>
class MultValue
private:
Type Factor; // The value to multiply by
public:
// Constructor initializes the value to multiply by
MultValue ( const Type& value ) : Factor ( value ) {
// The function call for the element to be multiplied
void operator( ) ( Type& elem ) const
elem *= Factor;
// The function object to determine the average
class Average
private:
long num; // The number of elements
long sum; // The sum of the elements
public:
// Constructor initializes the value to multiply by
Average( ) : num ( 0 ) , sum ( 0 )
// The function call to process the next elment
void operator( ) ( int elem )
num++; // Increment the element count
sum += elem; // Add the value to the partial sum
// return Average
operator double( )
return static_cast<double> (sum) /
static_cast<double> (num);
int main()
using namespace std;
vector<int> v1;
vector<int>::iterator Iter1;
// Constructing vector v1
int i;
for ( i = -4 ; i <= 2 ; i++ )
v1.push_back( i );
cout << "Original vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Using for_each to multiply each element by a Factor
for_each ( v1.begin( ), v1.end( ), MultValue<int> ( -2 ) );
cout << "Multiplying the elements of the vector v1\n "
<< "by the factor -2 gives:\n v1mod1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// The function object is templatized and so can be
// used again on the elements with a different Factor
for_each ( v1.begin( ), v1.end( ), MultValue<int> ( 5 ) );
cout << "Multiplying the elements of the vector v1mod\n "
<< "by the factor 5 gives:\n v1mod2 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// The local state of a function object can accumulate
// information about a sequence of actions that the
// return value can make available, here the Average
double avemod2 = for_each ( v1.begin( ), v1.end( ),
Average( ) );
cout << "The average of the elements of v1 is:\n Average ( v1mod2 ) = "
<< avemod2 << "." << endl;
Original vector v1 = ( -4 -3 -2 -1 0 1 2 ).
Multiplying the elements of the vector v1
by the factor -2 gives:
v1mod1 = ( 8 6 4 2 0 -2 -4 ).
Multiplying the elements of the vector v1mod
by the factor 5 gives:
v1mod2 = ( 40 30 20 10 0 -10 -20 ).
The average of the elements of v1 is:
Average ( v1mod2 ) = 10.
for_each_n
將指定的函式物件套用至範圍中以特定項目開頭的指定項目數目。
template<class InputIterator, class Size, class Function>
InputIterator for_each_n(
InputIterator first,
Size count,
Function func);
template<class ExecutionPolicy, class ForwardIterator, class Size, class Function>
ForwardIterator for_each_n(
ExecutionPolicy&& exec,
ForwardIterator first,
Size count,
Function func);
要使用的執行原則。
first
輸入反覆運算器,位於要操作之範圍中第一個專案的位置。
count
要操作的項目數目。
要套用至範圍 [first
, first
+ count
] 中的每個項目的使用者定義函式物件。
如果為零,則為最後一個處理 count
> 元素之後之專案的反覆運算器,否則為第一個專案。
count
必須是非負數,而且範圍中至少 count
必須有從 first
開始的專案。
此範例會定義函式物件類別。 生產程式代碼通常會使用 lambda
,以較少的程式代碼達到相同的結果。
// alg_for_each_n.cpp
// compile with /EHsc and /std:c++17 (or higher)
#include <algorithm>
#include <iostream>
#include <vector>
// The function object multiplies an element by a Factor
template <class Type> class MultValue
private:
Type Factor; // The value to multiply each element by
public:
// Constructor initializes the value to multiply by
MultValue(const Type &value) : Factor(value) {}
// The function call for the element to be multiplied
void operator()(Type &elem) const
elem *= Factor;
// Utility to display the contents of a vector
template <class T> void print_vector(const std::vector<T> &vec)
std::cout << "( ";
for (auto iter = vec.begin(); iter != vec.end(); iter++)
std::cout << *iter << ' ';
std::cout << ").\n";
int main()
std::vector<int> v;
// Construct vector with the elements -4...2
for (int i = -4; i <= 2; i++)
v.push_back(i);
std::cout << "Original vector v = ";
print_vector(v);
// Use for_each_n to multiply the first 3 elements by a Factor,
// saving the position in the vector after the first 3 elements
auto pos = for_each_n(v.begin(), 3, MultValue<int>(-2));
std::cout << "Multiplying the first 3 elements of the vector v\n "
<< "by the factor -2 gives:\n vmod1 = ";
print_vector(v);
// Using for_each_n to multiply the next 4 elements by a Factor,
// starting at the position saved by the previous for_each_n
for_each_n(pos, 4, MultValue<int>(-3));
std::cout << "Multiplying the next 4 elements of the vector v\n "
<< "by the factor -3 gives:\n vmod2 = ";
print_vector(v);
return 0;
Original vector v = ( -4 -3 -2 -1 0 1 2 ).
Multiplying the first 3 elements of the vector v
by the factor -2 gives:
vmod1 = ( 8 6 4 -1 0 1 2 ).
Multiplying the next 4 elements of the vector v
by the factor -3 gives:
vmod2 = ( 8 6 4 3 0 -3 -6 ).
generate
將函式物件產生的值指派給範圍內的每個項目。
template<class ForwardIterator, class Generator>
void generate(
ForwardIterator first,
ForwardIterator last,
Generator gen);
template<class ExecutionPolicy, class ForwardIterator, class Generator>
void generate(
ExecutionPolicy&& exec,
ForwardIterator first, ForwardIterator last,
Generator gen);
first
正向反覆運算器,位於要指派值範圍中第一個專案的位置。
正向反覆運算器,位於要指派值之範圍中最後一個項目之後的位置。
沒有自變數呼叫的函式物件,可產生要指派給範圍中每個元素的值。
會針對範圍中的每個專案叫用函式物件,而且每次呼叫時都不需要傳回相同的值。 例如,其可能會從檔案讀取,或是參考及修改本機狀態。 產生器的結果類型必須可轉換成範圍正向反覆運算器的實值類型。
參考的範圍必須有效。 所有指標都必須可取值,而且,在序列中,必須透過遞增從第一個位置觸達最後一個位置。
複雜度是線性的,與對產生器的確切 last - first
呼叫。
// alg_generate.cpp
// compile with: /EHsc
#include <vector>
#include <deque>
#include <algorithm>
#include <iostream>
#include <ostream>
int main()
using namespace std;
// Assigning random values to vector integer elements
vector<int> v1 ( 5 );
vector<int>::iterator Iter1;
deque<int> deq1 ( 5 );
deque<int>::iterator d1_Iter;
generate ( v1.begin( ), v1.end( ), rand );
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Assigning random values to deque integer elements
generate ( deq1.begin( ), deq1.end( ), rand );
cout << "Deque deq1 is ( " ;
for ( d1_Iter = deq1.begin( ) ; d1_Iter != deq1.end( ) ; d1_Iter++ )
cout << *d1_Iter << " ";
cout << ")." << endl;
Vector v1 is ( 41 18467 6334 26500 19169 ).
Deque deq1 is ( 15724 11478 29358 26962 24464 ).
generate_n
將函式物件所產生的值指派給範圍中的指定項目數目。 傳回最後一個指派值之後的位置。
template<class OutputIterator, class Diff, class Generator>
void generate_n(
OutputIterator first,
Diff count,
Generator gen);
template<class ExecutionPolicy, class ForwardIterator, class Size, class Generator>
ForwardIterator generate_n(
ExecutionPolicy&& exec,
ForwardIterator first,
Size count,
Generator gen);
要使用的執行原則。
first
輸出迭代器,指向範圍中第一個項目的位置 (要指派值至其中)。
count
帶正負號或不帶正負號的整數類型,指定要由產生器函式指派值的項目數。
不搭配引數呼叫的函式物件,用於產生要指派到範圍中每個項目的值。
會針對範圍中的每個專案叫用函式物件,而且每次呼叫時都不需要傳回相同的值。 例如,其可能會從檔案讀取,或是參考及修改本機狀態。 產生器的結果類型必須是可以轉換為轉送至此範圍之迭代器的值類型。
參考的範圍必須有效;所有指標必須是可取值且在序列中,還必須要可以從第一個位置開始透過增量而取得最後一個位置。
線性具有複雜度,因此需要對產生器執行明確的 count
呼叫。
// cl.exe /EHsc /nologo /W4 /MTd
#include <vector>
#include <deque>
#include <iostream>
#include <string>
#include <algorithm>
#include <random>
using namespace std;
template <typename C>
void print(const string& s, const C& c)
cout << s;
for (const auto& e : c) {
cout << e << " ";
cout << endl;
int main()
const int elemcount = 5;
vector<int> v(elemcount);
deque<int> dq(elemcount);
// Set up random number distribution
random_device rd;
mt19937 engine(rd());
uniform_int_distribution<int> dist(-9, 9);
// Call generate_n, using a lambda for the third parameter
generate_n(v.begin(), elemcount, [&](){ return dist(engine); });
print("vector v is: ", v);
generate_n(dq.begin(), elemcount, [&](){ return dist(engine); });
print("deque dq is: ", dq);
vector v is: 5 8 2 -9 6
deque dq is: 7 6 9 3 4
includes
測試一個排序範圍是否包含第二個排序範圍內的所有項目,其中項目之間的順序或等價準則可由二元述詞指定。
template<class InputIterator1, class InputIterator2>
bool includes(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2);
template<class InputIterator1, class InputIterator2, class Compare>
bool includes(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
Compare pred );
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
bool includes(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class Compare>
bool includes(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
Compare pred);
要使用的執行原則。
first1
輸入迭代器,定址要進行下列作業之兩個排序來源範圍的第一個範圍中第一個元素的位置:測試第二個範圍的所有元素是否都包含在第一個範圍中。
last1
輸入迭代器,定址要進行下列作業之兩個排序來源範圍的第一個範圍中最後一個元素之後的位置:測試第二個範圍的所有元素是否都包含在第一個範圍中。
first2
輸入迭代器,定址要進行下列作業之兩個連續排序來源範圍的第二個範圍中第一個元素的位置:測試第二個範圍的所有元素是否都包含在第一個範圍中。
last2
輸入迭代器,定址要進行下列作業之兩個連續排序來源範圍的第二個範圍中最後一個元素之後的位置:測試第二個範圍的所有元素是否都包含在第一個範圍中。
使用者定義的述詞函式物件,定義一個元素小於另一個元素的意義。 比較述詞會採用兩個自變數,並在滿足時和false
未滿足時傳回 true
。
true
如果第一個排序範圍包含第二個排序範圍中的所有專案,則為 ;否則為 false
。
考慮這項測試的另一種原因是它判斷第二個來源範圍是否為第一個來源範圍的子集。
參考的排序來源範圍必須有效;所有指標都必須可以取值,而且在每個序列中,必須可透過遞增從第一個位置到達最後一個位置。
做為演算法 includes
應用程式的先決條件,排序的來源範圍必須以演算法用來排序合併範圍時所使用的相同順序排列。
演算法不會修改 merge
來源範圍。
輸入反覆運算器的實值類型必須小於可比較的排序。 也就是說,假設有兩個元素,您可以判斷一個小於另一個元素,或者它們相等。 (這裡,對等表示兩者都不小於另一個。此比較會產生無等價專案之間的順序。 更精確地說,演算法會測試指定二進位述詞下第一個排序範圍中的所有元素是否具有對等順序,與第二個排序範圍中的元素相同。
演算法的複雜性是線性的,最多 2 * ((last1 - first1) + (last2 - first2)) - 1
比較無空來源範圍。
// alg_includes.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // For greater<int>( )
#include <iostream>
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser (int elem1, int elem2 )
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
int main()
using namespace std;
vector<int> v1a, v1b;
vector<int>::iterator Iter1a, Iter1b;
// Constructing vectors v1a & v1b with default less-than ordering
int i;
for ( i = -2 ; i <= 4 ; i++ )
v1a.push_back( i );
int ii;
for ( ii =-2 ; ii <= 3 ; ii++ )
v1b.push_back( ii );
cout << "Original vector v1a with range sorted by the\n "
<< "binary predicate less than is v1a = ( " ;
for ( Iter1a = v1a.begin( ) ; Iter1a != v1a.end( ) ; Iter1a++ )
cout << *Iter1a << " ";
cout << ")." << endl;
cout << "Original vector v1b with range sorted by the\n "
<< "binary predicate less than is v1b = ( " ;
for ( Iter1b = v1b.begin( ) ; Iter1b != v1b.end( ) ; Iter1b++ )
cout << *Iter1b << " ";
cout << ")." << endl;
// Constructing vectors v2a & v2b with ranges sorted by greater
vector<int> v2a ( v1a ) , v2b ( v1b );
vector<int>::iterator Iter2a, Iter2b;
sort ( v2a.begin( ), v2a.end( ), greater<int>( ) );
sort ( v2b.begin( ), v2b.end( ), greater<int>( ) );
v2a.pop_back( );
cout << "Original vector v2a with range sorted by the\n "
<< "binary predicate greater is v2a = ( " ;
for ( Iter2a = v2a.begin( ) ; Iter2a != v2a.end( ) ; Iter2a++ )
cout << *Iter2a << " ";
cout << ")." << endl;
cout << "Original vector v2b with range sorted by the\n "
<< "binary predicate greater is v2b = ( " ;
for ( Iter2b = v2b.begin( ) ; Iter2b != v2b.end( ) ; Iter2b++ )
cout << *Iter2b << " ";
cout << ")." << endl;
// Constructing vectors v3a & v3b with ranges sorted by mod_lesser
vector<int> v3a ( v1a ), v3b ( v1b ) ;
vector<int>::iterator Iter3a, Iter3b;
reverse (v3a.begin( ), v3a.end( ) );
v3a.pop_back( );
v3a.pop_back( );
sort ( v3a.begin( ), v3a.end( ), mod_lesser );
sort ( v3b.begin( ), v3b.end( ), mod_lesser );
cout << "Original vector v3a with range sorted by the\n "
<< "binary predicate mod_lesser is v3a = ( " ;
for ( Iter3a = v3a.begin( ) ; Iter3a != v3a.end( ) ; Iter3a++ )
cout << *Iter3a << " ";
cout << ")." << endl;
cout << "Original vector v3b with range sorted by the\n "
<< "binary predicate mod_lesser is v3b = ( " ;
for ( Iter3b = v3b.begin( ) ; Iter3b != v3b.end( ) ; Iter3b++ )
cout << *Iter3b << " ";
cout << ")." << endl;
// To test for inclusion under an asscending order
// with the default binary predicate less<int>( )
bool Result1;
Result1 = includes ( v1a.begin( ), v1a.end( ),
v1b.begin( ), v1b.end( ) );
if ( Result1 )
cout << "All the elements in vector v1b are "
<< "contained in vector v1a." << endl;
cout << "At least one of the elements in vector v1b "
<< "is not contained in vector v1a." << endl;
// To test for inclusion under descending
// order specify binary predicate greater<int>( )
bool Result2;
Result2 = includes ( v2a.begin( ), v2a.end( ),
v2b.begin( ), v2b.end( ), greater<int>( ) );
if ( Result2 )
cout << "All the elements in vector v2b are "
<< "contained in vector v2a." << endl;
cout << "At least one of the elements in vector v2b "
<< "is not contained in vector v2a." << endl;
// To test for inclusion under a user
// defined binary predicate mod_lesser
bool Result3;
Result3 = includes ( v3a.begin( ), v3a.end( ),
v3b.begin( ), v3b.end( ), mod_lesser );
if ( Result3 )
cout << "All the elements in vector v3b are "
<< "contained under mod_lesser in vector v3a."
<< endl;
cout << "At least one of the elements in vector v3b is "
<< " not contained under mod_lesser in vector v3a."
<< endl;
Original vector v1a with range sorted by the
binary predicate less than is v1a = ( -2 -1 0 1 2 3 4 ).
Original vector v1b with range sorted by the
binary predicate less than is v1b = ( -2 -1 0 1 2 3 ).
Original vector v2a with range sorted by the
binary predicate greater is v2a = ( 4 3 2 1 0 -1 ).
Original vector v2b with range sorted by the
binary predicate greater is v2b = ( 3 2 1 0 -1 -2 ).
Original vector v3a with range sorted by the
binary predicate mod_lesser is v3a = ( 0 1 2 3 4 ).
Original vector v3b with range sorted by the
binary predicate mod_lesser is v3b = ( 0 -1 1 -2 2 3 ).
All the elements in vector v1b are contained in vector v1a.
At least one of the elements in vector v2b is not contained in vector v2a.
At least one of the elements in vector v3b is not contained under mod_lesser in vector v3a.
inplace_merge
將兩個連續排序範圍內的項目結合成單一排序範圍,其中順序準則可由二元述詞指定。
template<class BidirectionalIterator>
void inplace_merge(
BidirectionalIterator first,
BidirectionalIterator middle,
BidirectionalIterator last);
template<class BidirectionalIterator, class Compare>
void inplace_merge(
BidirectionalIterator first,
BidirectionalIterator middle,
BidirectionalIterator last,
Compare pred);
template<class ExecutionPolicy, class BidirectionalIterator>
void inplace_merge(
ExecutionPolicy&& exec,
BidirectionalIterator first,
BidirectionalIterator middle,
BidirectionalIterator last);
template<class ExecutionPolicy, class BidirectionalIterator, class Compare>
void inplace_merge(
ExecutionPolicy&& exec,
BidirectionalIterator first,
BidirectionalIterator middle,
BidirectionalIterator last,
Compare pred);
要使用的執行原則。
first
雙向迭代器,定址要結合並排序成單一範圍之兩個連續排序範圍的第一個範圍中第一個元素的位置。
middle
雙向迭代器,定址要結合並排序成單一範圍之兩個連續排序範圍的第二個範圍中第一個元素的位置。
雙向迭代器,定址要結合並排序成單一範圍之兩個連續排序範圍的第二個範圍中最後一個元素之後的位置。
使用者定義的述詞函式物件,定義一個元素小於另一個元素的意義。 比較述詞會採用兩個自變數,而且當第一個專案小於第二個元素false
時,應該傳回 ,否則應該傳回 true
。
參考的排序連續範圍必須有效;所有指標都必須可以取值,而且在每個序列中,必須可透過遞增從第一個位置到達最後一個位置。
每個排序連續範圍都必須根據 inplace_merge
演算法用來排序結合範圍的相同順序,排列成套用此演算法的前置條件。 因為會保留每個範圍內元素的相對順序,所以這項作業十分穩定。 兩個來源範圍中有對等元素時,結合範圍之第一個範圍中的元素會優先於第二個範圍中的元素。
因為演算法會將記憶體配置給暫存緩衝區,所以複雜度取決於可用記憶體。 如果有足夠的記憶體可用,則最佳案例是線性比較 (last - first) - 1
;如果沒有可用的輔助記憶體,則最差的情況是 N log(N)
,其中 N
= last
- first
。
// alg_inplace_merge.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> //For greater<int>( )
#include <iostream>
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser ( int elem1, int elem2 )
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
int main()
using namespace std;
vector<int> v1;
vector<int>::iterator Iter1, Iter2, Iter3;
// Constructing vector v1 with default less-than ordering
int i;
for ( i = 0 ; i <= 5 ; i++ )
v1.push_back( i );
int ii;
for ( ii =-5 ; ii <= 0 ; ii++ )
v1.push_back( ii );
cout << "Original vector v1 with subranges sorted by the\n "
<< "binary predicate less than is v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// Constructing vector v2 with ranges sorted by greater
vector<int> v2 ( v1 );
vector<int>::iterator break2;
break2 = find ( v2.begin( ), v2.end( ), -5 );
sort ( v2.begin( ), break2 , greater<int>( ) );
sort ( break2 , v2.end( ), greater<int>( ) );
cout << "Original vector v2 with subranges sorted by the\n "
<< "binary predicate greater is v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
// Constructing vector v3 with ranges sorted by mod_lesser
vector<int> v3 ( v1 );
vector<int>::iterator break3;
break3 = find ( v3.begin( ), v3.end( ), -5 );
sort ( v3.begin( ), break3 , mod_lesser );
sort ( break3 , v3.end( ), mod_lesser );
cout << "Original vector v3 with subranges sorted by the\n "
<< "binary predicate mod_lesser is v3 = ( " ;
for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )
cout << *Iter3 << " ";
cout << ")" << endl;
vector<int>::iterator break1;
break1 = find (v1.begin( ), v1.end( ), -5 );
inplace_merge ( v1.begin( ), break1, v1.end( ) );
cout << "Merged inplace with default order,\n vector v1mod = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// To merge inplace in descending order, specify binary
// predicate greater<int>( )
inplace_merge ( v2.begin( ), break2 , v2.end( ) , greater<int>( ) );
cout << "Merged inplace with binary predicate greater specified,\n "
<< "vector v2mod = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
// Applying a user defined (UD) binary predicate mod_lesser
inplace_merge ( v3.begin( ), break3, v3.end( ), mod_lesser );
cout << "Merged inplace with binary predicate mod_lesser specified,\n "
<< "vector v3mod = ( " ; ;
for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )
cout << *Iter3 << " ";
cout << ")" << endl;
Original vector v1 with subranges sorted by the
binary predicate less than is v1 = ( 0 1 2 3 4 5 -5 -4 -3 -2 -1 0 )
Original vector v2 with subranges sorted by the
binary predicate greater is v2 = ( 5 4 3 2 1 0 0 -1 -2 -3 -4 -5 )
Original vector v3 with subranges sorted by the
binary predicate mod_lesser is v3 = ( 0 1 2 3 4 5 0 -1 -2 -3 -4 -5 )
Merged inplace with default order,
vector v1mod = ( -5 -4 -3 -2 -1 0 0 1 2 3 4 5 )
Merged inplace with binary predicate greater specified,
vector v2mod = ( 5 4 3 2 1 0 0 -1 -2 -3 -4 -5 )
Merged inplace with binary predicate mod_lesser specified,
vector v3mod = ( 0 0 1 -1 2 -2 3 -3 4 -4 5 -5 )
is_heap
如果在指定範圍內的項目形成堆積,則傳回 true
。
template<class RandomAccessIterator>
bool is_heap(
RandomAccessIterator first,
RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
bool is_heap(
RandomAccessIterator first,
RandomAccessIterator last,
Compare pred);
template<class ExecutionPolicy, class RandomAccessIterator>
bool is_heap(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator last);
template<class ExecutionPolicy, class RandomAccessIterator, class Compare>
bool is_heap(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator last,
Compare pred);
要使用的執行原則。
first
隨機存取迭代器,表示檢查堆積的範圍開始。
隨機存取迭代器,表示範圍結尾。
要測試以排序元素的條件。 比較述詞接受兩個自變數,並傳 true
回 或 false
。
true
如果指定的範圍中的專案形成堆積,false
則傳回 ,如果不是。
第一個範本函式會傳回 is_heap_until
(first , last) == last
。
第二個範本函式會傳回
is_heap_until(first, last, pred) == last
.
is_heap_until
傳回位於範圍 [ first
, last
] 中第一個元素的反覆運算器,該元素不符合堆積排序條件,或 end
範圍是否形成堆積。
template<class RandomAccessIterator>
RandomAccessIterator is_heap_until(
RandomAccessIterator first,
RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
RandomAccessIterator is_heap_until(
RandomAccessIterator first,
RandomAccessIterator last,
Compare pred);
template<class ExecutionPolicy, class RandomAccessIterator>
RandomAccessIterator is_heap_until(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator last);
template<class ExecutionPolicy, class RandomAccessIterator, class Compare>
RandomAccessIterator is_heap_until(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator last,
Compare pred);
要使用的執行原則。
first
隨機存取迭代器,指定要檢查有無堆積之範圍的第一個項目。
隨機存取迭代器,指定要檢查有無堆積的範圍結尾。
二元述詞,指定定義堆積的嚴格弱式排序條件。 默認述詞是在 std::less<>
未指定時 pred
。
如果指定的範圍形成堆積,或包含一個或更少的項目,則傳回 last
。 否則,會傳回找不到不符合堆積條件之第一個專案的反覆運算器。
第一個範本函式會傳回 [first, last)
中的最後一個迭代器 next
,其中 [first, next)
是依函式物件 std::less<>
排序的堆積。 如果距離 last - first
小於 2,函式會傳 last
回 。
第二個樣板函式的行為與第一個樣板函式相同,但會使用述詞 pred
(而不是 std::less<>
) 做為堆積排序條件。
is_partitioned
如果在指定範圍內針對條件測試為 true
的所有項目都是在測試為 true
的任何項目之前,傳回 false
。
template<class InputIterator, class UnaryPredicate>
bool is_partitioned(
InputIterator first,
InputIterator last,
UnaryPredicate pred);
template <class ExecutionPolicy, class ForwardIterator, class UnaryPredicate>
bool is_partitioned(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
要使用的執行原則。
first
輸入迭代器,表示範圍開始檢查條件的位置。
輸入迭代器,表示範圍結尾。
要測試的條件。 此測試是由使用者定義的述詞函式物件所提供,該物件會定義所搜尋之元素所要滿足的條件。 一元述詞接受單一自變數並傳 true
回 或 false
。
true
傳回當指定範圍內測試條件的所有專案都出現在任何測試 true
false
的專案之前,否則會傳false
回 。
只有在透過 pred
分割 [first, last)
中的所有元素時,這個範本函式才會傳回 true
;亦即,[first, last)
中 pred (X)
為 true 的所有元素 X
發生在 pred (Y)
為 false
的所有元素 Y
之前。
is_permutation
true
如果這兩個範圍都包含相同的專案,不論項目的順序是否相同,則傳回 。 使用 C++14 程式代碼中的雙範圍多載,因為如果第二個範圍超過第一個範圍,則只有單一反覆運算器的多載不會偵測到差異。 如果第二個範圍比第一個範圍短,這些多載將會導致未定義的行為。
template<class ForwardIterator1, class ForwardIterator2>
bool is_permutation(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2);
template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
bool is_permutation(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
BinaryPredicate Pred);
// C++14
template<class ForwardIterator1, class ForwardIterator2>
bool is_permutation(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
bool is_permutation(
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred);
first1
指向範圍的第一個項目的正向迭代器。
last1
指向範圍的最後項目前一個的正向迭代器。
first2
指向第二個範圍的第一個項目的正向迭代器,用於比較。
last2
指向第二個範圍的最後一個項目之某個項目的正向迭代器,用於比較。
述詞,用於測試是否相等並傳回 bool
。
可根據比較子述詞,將範圍重新排列成完全相同時,則為 true
,否則為 false
。
is_permutation
在最壞的情況有二次方的複雜性。
第一個範本函式假設範圍 first2
中的元素數目與 所 [first1, last1)
指定的範圍一樣多。 如果第二個範圍中有更多元素,則會忽略它們;如果較少,則會發生未定義的行為。 第三個範本函式 (C++14 和更新版本) 不會進行此假設。 這兩者都只會在 指定[first1, last1)
Y
範圍中的每個專案X
在 相同範圍X == Y
中,從或 [first2, last2)
開始first2
,才會傳回 true
。 在這裡, operator==
必須執行其操作數之間的成對比較。
第二個和第四個樣板函式的行為相同,不同之處是它們會以 Pred(X, Y)
取代 operator==(X, Y)
。 若要正確運作,述詞必須是對稱、反射和可轉移。
下列範例顯示如何使用 is_permutation
:
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
vector<int> vec_1{ 2, 3, 0, 1, 4, 5 };
vector<int> vec_2{ 5, 4, 0, 3, 1, 2 };
vector<int> vec_3{ 4, 9, 13, 3, 6, 5 };
vector<int> vec_4{ 7, 4, 11, 9, 2, 1 };
cout << "(1) Compare using built-in == operator: ";
cout << boolalpha << is_permutation(vec_1.begin(), vec_1.end(),
vec_2.begin(), vec_2.end()) << endl; // true
cout << "(2) Compare after modifying vec_2: ";
vec_2[0] = 6;
cout << is_permutation(vec_1.begin(), vec_1.end(),
vec_2.begin(), vec_2.end()) << endl; // false
// Define equivalence as "both are odd or both are even"
cout << "(3) vec_3 is a permutation of vec_4: ";
cout << is_permutation(vec_3.begin(), vec_3.end(),
vec_4.begin(), vec_4.end(),
[](int lhs, int rhs) { return lhs % 2 == rhs % 2; }) << endl; // true
// Initialize a vector using the 's' string literal to specify a std::string
vector<string> animals_1{ "dog"s, "cat"s, "bird"s, "monkey"s };
vector<string> animals_2{ "donkey"s, "bird"s, "meerkat"s, "cat"s };
// Define equivalence as "first letters are equal":
bool is_perm = is_permutation(animals_1.begin(), animals_1.end(), animals_2.begin(), animals_2.end(),
[](const string& lhs, const string& rhs)
return lhs[0] == rhs[0]; //std::string guaranteed to have at least a null terminator
cout << "animals_2 is a permutation of animals_1: " << is_perm << endl; // true
return 0;
(1) Compare using built-in == operator: true
(2) Compare after modifying vec_2: false
(3) vec_3 is a permutation of vec_4: true
animals_2 is a permutation of animals_1: true
is_sorted
如果在指定範圍內的項目為已排序順序,則傳回 true
。
template<class ForwardIterator>
bool is_sorted(
ForwardIterator first,
ForwardIterator last);
template<class ForwardIterator, class Compare>
bool is_sorted(
ForwardIterator first,
ForwardIterator last,
Compare pred);
template<class ExecutionPolicy, class ForwardIterator>
bool is_sorted(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last);
template<class ExecutionPolicy, class ForwardIterator, class Compare>
bool is_sorted(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
Compare pred);
要使用的執行原則。
first
正向迭代器,表示要檢查之範圍的開始位置。
正向迭代器,表示範圍結尾。
要測試以判斷兩個元素間之順序的條件。 比較述詞接受兩個自變數,並傳 true
回 或 false
。 這個述詞會執行與 operator<
相同的工作。
第一個範本函式會傳回 is_sorted_until
( first, last ) == last
。 函 operator<
式會執行順序比較。
第二個範本函式會傳回 is_sorted_until( first, last , pred ) == last
。 pred
述詞函式會執行順序比較。
is_sorted_until
傳回 ForwardIterator
,以設定為指定範圍中依排序順序的最後一個元素。
第二個版本可讓您提供比較函式物件,這個物件會在 true
兩個指定元素依排序順序時傳回, false
否則會傳回 。
template<class ForwardIterator>
ForwardIterator is_sorted_until(
ForwardIterator first,
ForwardIterator last);
template<class ForwardIterator, class Compare>
ForwardIterator is_sorted_until(
ForwardIterator first,
ForwardIterator last,
Compare pred);
template<class ExecutionPolicy, class ForwardIterator>
ForwardIterator is_sorted_until(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last);
template<class ExecutionPolicy, class ForwardIterator, class Compare>
ForwardIterator is_sorted_until(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
Compare pred);
要使用的執行原則。
first
正向迭代器,表示要檢查之範圍的開始位置。
正向迭代器,表示範圍結尾。
要測試以判斷兩個元素間之順序的條件。 比較述詞接受兩個自變數,並傳 true
回 或 false
。
傳回設定為排序順序中最後一個元素的 ForwardIterator
。 排序序列開始於 first
。
第一個範本函式會傳回 [first, last]
中的最後一個迭代器 next
,因此 [first, next)
是依 operator<
所排列的排序序列。 如果 distance()
小於 2,則函式會傳 last
回 。
第二個範本函式的行為相同,差異在於它會將 operator<(X, Y)
取代為 pred(X, Y)
。
iter_swap
交換由一組指定之迭代器所參考的兩個值。
template<class ForwardIterator1, class ForwardIterator2>
void iter_swap( ForwardIterator1 left, ForwardIterator2 right );
要交換其值的其中一個正向迭代器。
right
要交換其值的第二個正向迭代器。
swap
應以喜好設定為 iter_swap,這是包含在 C++ Standard 中,以提供回溯相容性。 如果 Fit1
與 Fit2
正向反覆運算器,則 iter_swap( Fit1, Fit2 )
等於 swap( *Fit1, *Fit2 )
。
輸入正向迭代器的實值類型值必須相同。
// alg_iter_swap.cpp
// compile with: /EHsc
#include <vector>
#include <deque>
#include <algorithm>
#include <iostream>
#include <ostream>
using namespace std;
class CInt;
ostream& operator<<( ostream& osIn, const CInt& rhs );
class CInt
public:
CInt( int n = 0 ) : m_nVal( n ){}
CInt( const CInt& rhs ) : m_nVal( rhs.m_nVal ){}
CInt& operator=( const CInt& rhs ) { m_nVal =
rhs.m_nVal; return *this; }
bool operator<( const CInt& rhs ) const
{ return ( m_nVal < rhs.m_nVal );}
friend ostream& operator<<( ostream& osIn, const CInt& rhs );
private:
int m_nVal;
inline ostream& operator<<( ostream& osIn, const CInt& rhs )
osIn << "CInt(" << rhs.m_nVal << ")";
return osIn;
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser ( int elem1, int elem2 )
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
int main()
CInt c1 = 5, c2 = 1, c3 = 10;
deque<CInt> deq1;
deque<CInt>::iterator d1_Iter;
deq1.push_back ( c1 );
deq1.push_back ( c2 );
deq1.push_back ( c3 );
cout << "The original deque of CInts is deq1 = (";
for ( d1_Iter = deq1.begin( ); d1_Iter != --deq1.end( ); d1_Iter++ )
cout << " " << *d1_Iter << ",";
d1_Iter = --deq1.end( );
cout << " " << *d1_Iter << " )." << endl;
// Exchanging first and last elements with iter_swap
iter_swap ( deq1.begin( ), --deq1.end( ) );
cout << "The deque of CInts with first & last elements swapped is:\n deq1 = (";
for ( d1_Iter = deq1.begin( ); d1_Iter != --deq1.end( ); d1_Iter++ )
cout << " " << *d1_Iter << ",";
d1_Iter = --deq1.end( );
cout << " " << *d1_Iter << " )." << endl;
// Swapping back first and last elements with swap
swap ( *deq1.begin( ), *(deq1.end( ) -1 ) );
cout << "The deque of CInts with first & last elements swapped back is:\n deq1 = (";
for ( d1_Iter = deq1.begin( ); d1_Iter != --deq1.end( ); d1_Iter++ )
cout << " " << *d1_Iter << ",";
d1_Iter = --deq1.end( );
cout << " " << *d1_Iter << " )." << endl;
// Swapping a vector element with a deque element
vector<int> v1;
vector<int>::iterator Iter1;
deque<int> deq2;
deque<int>::iterator d2_Iter;
int i;
for ( i = 0 ; i <= 3 ; i++ )
v1.push_back( i );
int ii;
for ( ii = 4 ; ii <= 5 ; ii++ )
deq2.push_back( ii );
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
cout << "Deque deq2 is ( " ;
for ( d2_Iter = deq2.begin( ) ; d2_Iter != deq2.end( ) ; d2_Iter++ )
cout << *d2_Iter << " ";
cout << ")." << endl;
iter_swap ( v1.begin( ), deq2.begin( ) );
cout << "After exchanging first elements,\n vector v1 is: v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl << " & deque deq2 is: deq2 = ( ";
for ( d2_Iter = deq2.begin( ) ; d2_Iter != deq2.end( ) ; d2_Iter++ )
cout << *d2_Iter << " ";
cout << ")." << endl;
The original deque of CInts is deq1 = ( CInt(5), CInt(1), CInt(10) ).
The deque of CInts with first & last elements swapped is:
deq1 = ( CInt(10), CInt(1), CInt(5) ).
The deque of CInts with first & last elements swapped back is:
deq1 = ( CInt(5), CInt(1), CInt(10) ).
Vector v1 is ( 0 1 2 3 ).
Deque deq2 is ( 4 5 ).
After exchanging first elements,
vector v1 is: v1 = ( 4 1 2 3 ).
& deque deq2 is: deq2 = ( 0 5 ).
lexicographical_compare
逐一比較兩個序列之間的每個項目,判斷兩者較小者。
template<class InputIterator1, class InputIterator2>
bool lexicographical_compare(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2 );
template<class InputIterator1, class InputIterator2, class Compare>
bool lexicographical_compare(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
Compare pred );
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
bool lexicographical_compare(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class Compare>
bool lexicographical_compare(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
Compare pred);
要使用的執行原則。
first1
輸入迭代器,定址要比較之第一個範圍中第一個元素的位置。
last1
輸入迭代器,定址要比較之第一個範圍中最後一個元素之後的位置。
first2
輸入迭代器,定址要比較之第二個範圍中第一個元素的位置。
last2
輸入迭代器,定址要比較之第二個範圍中最後一個元素之後的位置。
使用者定義的述詞函式物件,定義一個元素小於另一個元素的意義。 比較述詞會採用兩個自變數,並在滿足時和false
未滿足時傳回 true
。
true
如果第一個範圍在語匯上小於第二個範圍,則為 ;否則 false
為 。
序列間辭典編纂的比較會依元素逐一進行比較,直到符合下列其中一種情況:
發現兩個對應的元素不相等,並將其比較的結果作為序列間比較的結果。
找不到任何差異,但有一個序列的元素數比另一個序列還要多,因而將較短的序列視為小於較長的序列。
找不到任何不平等,且序列的元素數目相同,因此序列相等且比較的結果為 false
。
// alg_lex_comp.cpp
// compile with: /EHsc
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
// Return whether second element is twice the first
bool twice ( int elem1, int elem2 )
return 2 * elem1 < elem2;
int main()
using namespace std;
vector<int> v1, v2;
list<int> L1;
vector<int>::iterator Iter1, Iter2;
list<int>::iterator L1_Iter, L1_inIter;
int i;
for ( i = 0 ; i <= 5 ; i++ )
v1.push_back( 5 * i );
int ii;
for ( ii = 0 ; ii <= 6 ; ii++ )
L1.push_back( 5 * ii );
int iii;
for ( iii = 0 ; iii <= 5 ; iii++ )
v2.push_back( 10 * iii );
cout << "Vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
cout << "List L1 = ( " ;
for ( L1_Iter = L1.begin( ) ; L1_Iter!= L1.end( ) ; L1_Iter++ )
cout << *L1_Iter << " ";
cout << ")" << endl;
cout << "Vector v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")" << endl;
// Self lexicographical_comparison of v1 under identity
bool result1;
result1 = lexicographical_compare (v1.begin( ), v1.end( ),
v1.begin( ), v1.end( ) );
if ( result1 )
cout << "Vector v1 is lexicographically_less than v1." << endl;
cout << "Vector v1 is not lexicographically_less than v1." << endl;
// lexicographical_comparison of v1 and L2 under identity
bool result2;
result2 = lexicographical_compare (v1.begin( ), v1.end( ),
L1.begin( ), L1.end( ) );
if ( result2 )
cout << "Vector v1 is lexicographically_less than L1." << endl;
cout << "Vector v1 is lexicographically_less than L1." << endl;
bool result3;
result3 = lexicographical_compare (v1.begin( ), v1.end( ),
v2.begin( ), v2.end( ), twice );
if ( result3 )
cout << "Vector v1 is lexicographically_less than v2 "
<< "under twice." << endl;
cout << "Vector v1 is not lexicographically_less than v2 "
<< "under twice." << endl;
Vector v1 = ( 0 5 10 15 20 25 )
List L1 = ( 0 5 10 15 20 25 30 )
Vector v2 = ( 0 10 20 30 40 50 )
Vector v1 is not lexicographically_less than v1.
Vector v1 is lexicographically_less than L1.
Vector v1 is not lexicographically_less than v2 under twice.
lower_bound
尋找排序範圍中第一個專案的位置,這個範圍的值大於或等於指定的值。 排序準則可由二元述詞指定。
template<class ForwardIterator, class Type>
ForwardIterator lower_bound(
ForwardIterator first,
ForwardIterator last,
const Type& value );
template<class ForwardIterator, class Type, class BinaryPredicate>
ForwardIterator lower_bound(
ForwardIterator first,
ForwardIterator last,
const Type& value,
BinaryPredicate pred );
first
正向迭代器,其定址要搜尋範圍中第一個元素的位置。
正向迭代器,其定址要搜尋範圍中最後一個元素之後的位置。
value
正在搜尋排序範圍中第一個位置或可能第一個位置的值。
使用者定義的述詞函式物件,定義一個元素小於另一個元素的意義。 二元述詞會採用兩個引數,並且在符合時傳回 true
,不符合時則傳回 false
。
正向反覆運算器,位於排序範圍中第一個專案的位置,其值大於或等於指定值。 可以使用二進位述詞來指定等價。
參考的排序來源範圍必須有效;所有迭代器都必須可以取值,而且在序列中,必須可透過遞增從第一個位置到達最後一個位置。
排序範圍是使用 lower_bound
的前置條件,而且順序與二元述詞所指定的順序相同。
演算法不會修改 lower_bound
範圍。
正向反覆運算器的實值型別必須小於可比較的排序。 也就是說,假設有兩個元素,您可以判斷一個小於另一個元素,或者它們相等。 (這裡,對等表示兩者都不小於另一個。此比較會產生無等價專案之間的順序。
演算法的複雜度是隨機存取反覆運算器的對數,否則為線性,步驟數目與 (last - first
) 成正比。
// alg_lower_bound.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // greater<int>( )
#include <iostream>
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser( int elem1, int elem2 )
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
int main()
using namespace std;
vector<int> v1;
// Constructing vector v1 with default less-than ordering
for ( auto i = -1 ; i <= 4 ; ++i )
v1.push_back( i );
for ( auto ii =-3 ; ii <= 0 ; ++ii )
v1.push_back( ii );
cout << "Starting vector v1 = ( " ;
for (const auto &Iter : v1)
cout << Iter << " ";
cout << ")." << endl;
sort(v1.begin(), v1.end());
cout << "Original vector v1 with range sorted by the\n "
<< "binary predicate less than is v1 = ( " ;
for (const auto &Iter : v1)
cout << Iter << " ";
cout << ")." << endl;
// Constructing vector v2 with range sorted by greater
vector<int> v2(v1);
sort(v2.begin(), v2.end(), greater<int>());
cout << "Original vector v2 with range sorted by the\n "
<< "binary predicate greater is v2 = ( " ;
for (const auto &Iter : v2)
cout << Iter << " ";
cout << ")." << endl;
// Constructing vectors v3 with range sorted by mod_lesser
vector<int> v3(v1);
sort(v3.begin(), v3.end(), mod_lesser);
cout << "Original vector v3 with range sorted by the\n "
<< "binary predicate mod_lesser is v3 = ( " ;
for (const auto &Iter : v3)
cout << Iter << " ";
cout << ")." << endl;
// Demonstrate lower_bound
vector<int>::iterator Result;
// lower_bound of 3 in v1 with default binary predicate less<int>()
Result = lower_bound(v1.begin(), v1.end(), 3);
cout << "The lower_bound in v1 for the element with a value of 3 is: "
<< *Result << "." << endl;
// lower_bound of 3 in v2 with the binary predicate greater<int>( )
Result = lower_bound(v2.begin(), v2.end(), 3, greater<int>());
cout << "The lower_bound in v2 for the element with a value of 3 is: "
<< *Result << "." << endl;
// lower_bound of 3 in v3 with the binary predicate mod_lesser
Result = lower_bound(v3.begin(), v3.end(), 3, mod_lesser);
cout << "The lower_bound in v3 for the element with a value of 3 is: "
<< *Result << "." << endl;
Starting vector v1 = ( -1 0 1 2 3 4 -3 -2 -1 0 ).
Original vector v1 with range sorted by the
binary predicate less than is v1 = ( -3 -2 -1 -1 0 0 1 2 3 4 ).
Original vector v2 with range sorted by the
binary predicate greater is v2 = ( 4 3 2 1 0 0 -1 -1 -2 -3 ).
Original vector v3 with range sorted by the
binary predicate mod_lesser is v3 = ( 0 0 -1 -1 1 -2 2 -3 3 4 ).
The lower_bound in v1 for the element with a value of 3 is: 3.
The lower_bound in v2 for the element with a value of 3 is: 3.
The lower_bound in v3 for the element with a value of 3 is: -3.
make_heap
將在指定範圍內的項目轉換為堆積,其中第一個項目是最大,而且排序準則可由二元述詞指定。
template<class RandomAccessIterator>
void make_heap(
RandomAccessIterator first,
RandomAccessIterator last );
template<class RandomAccessIterator, class BinaryPredicate>
void make_heap(
RandomAccessIterator first,
RandomAccessIterator last,
BinaryPredicate pred );
first
隨機存取迭代器,定址要轉換為堆積之範圍中第一個元素的位置。
隨機存取迭代器,定址要轉換為堆積之範圍中最後一個元素之後的位置。
使用者定義的述詞函式物件,定義一個元素小於另一個元素的意義。 二元述詞會採用兩個引數,並且在符合時傳回 true
,不符合時則傳回 false
。
堆積有兩個屬性:
第一個元素一律最大。
可以在對數時間新增或移除元素。
堆積是實作優先順序佇列的理想方式,而且用於實作 C++ 標準連結庫容器配接器 priority_queue 類別。
複雜度是線性的,需要 3 * (last - first)
比較。
// alg_make_heap.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
int main() {
using namespace std;
vector<int> v1, v2;
vector<int>::iterator Iter1, Iter2;
int i;
for ( i = 0 ; i <= 9 ; i++ )
v1.push_back( i );
random_shuffle( v1.begin( ), v1.end( ) );
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Make v1 a heap with default less than ordering
make_heap ( v1.begin( ), v1.end( ) );
cout << "The heaped version of vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Make v1 a heap with greater than ordering
make_heap ( v1.begin( ), v1.end( ), greater<int>( ) );
cout << "The greater-than heaped version of v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
Vector v1 is ( 4 3 7 8 0 5 2 1 6 9 ).
The heaped version of vector v1 is ( 9 8 7 6 3 5 2 1 4 0 ).
The greater-than heaped version of v1 is ( 0 1 2 4 3 5 7 6 9 8 ).
比較兩個物件並傳回兩者較大者,其中順序準則可由二元述詞指定。
template<class Type>
constexpr Type& max(
const Type& left,
const Type& right);
template<class Type, class Pr>
constexpr Type& max(
const Type& left,
const Type& right,
BinaryPredicate pred);
template<class Type>
constexpr Type& max (
initializer_list<Type> ilist);
template<class Type, class Pr>
constexpr Type& max(
initializer_list<Type> ilist,
BinaryPredicate pred);
正在比較的兩個物件之第一個。
right
正在比較的兩個物件之第二個。
用來比較兩個物件的二元述詞。
inlist
包含要比較的物件之初始設定式清單。
兩個物件中較大的一個,除非兩者一樣大,在此情況下,它會傳回兩個物件的第一個。 initializer_list
指定 時,它會傳回清單中最大的物件。
max
是不尋常的演算法,因為它將物件做為參數傳遞。 大部分 C++ 標準程式庫演算法可對某範圍的元素作業,其位置由迭代器作為參數傳遞來加以指定。 如果您需要在專案範圍上運作的函式,請改用 max_element
。 Visual Studio 2017 會在採用 initializer_list
的多載上啟用 constexpr
。
// alg_max.cpp
// compile with: /EHsc
#include <vector>
#include <set>
#include <algorithm>
#include <iostream>
#include <ostream>
using namespace std;
class CInt;
ostream& operator<<( ostream& osIn, const CInt& rhs );
class CInt
public:
CInt( int n = 0 ) : m_nVal( n ){}
CInt( const CInt& rhs ) : m_nVal( rhs.m_nVal ){}
CInt& operator=( const CInt& rhs ) {m_nVal =
rhs.m_nVal; return *this;}
bool operator<( const CInt& rhs ) const
{return ( m_nVal < rhs.m_nVal );}
friend ostream& operator<<( ostream& osIn, const CInt& rhs );
private:
int m_nVal;
inline ostream& operator<<( ostream& osIn, const CInt& rhs )
osIn << "CInt( " << rhs.m_nVal << " )";
return osIn;
// Return whether absolute value of elem1 is greater than
// absolute value of elem2
bool abs_greater ( int elem1, int elem2 )
if ( elem1 < 0 )
elem1 = -elem1;
if ( elem2 < 0 )
elem2 = -elem2;
return elem1 < elem2;
int main()
int a = 6, b = -7;
// Return the integer with the larger absolute value
const int& result1 = max(a, b, abs_greater);
// Return the larger integer
const int& result2 = max(a, b);
cout << "Using integers 6 and -7..." << endl;
cout << "The integer with the greater absolute value is: "
<< result1 << "." << endl;
cout << "The integer with the greater value is: "
<< result2 << "." << endl;
cout << endl;
// Comparing the members of an initializer_list
const int& result3 = max({ a, b });
const int& result4 = max({ a, b }, abs_greater);
cout << "Comparing the members of an initializer_list..." << endl;
cout << "The member with the greater value is: " << result3 << endl;
cout << "The integer with the greater absolute value is: " << result4 << endl;
// Comparing set containers with elements of type CInt
// using the max algorithm
CInt c1 = 1, c2 = 2, c3 = 3;
set<CInt> s1, s2, s3;
set<CInt>::iterator s1_Iter, s2_Iter, s3_Iter;
s1.insert ( c1 );
s1.insert ( c2 );
s2.insert ( c2 );
s2.insert ( c3 );
cout << "s1 = (";
for ( s1_Iter = s1.begin( ); s1_Iter != --s1.end( ); s1_Iter++ )
cout << " " << *s1_Iter << ",";
s1_Iter = --s1.end( );
cout << " " << *s1_Iter << " )." << endl;
cout << "s2 = (";
for ( s2_Iter = s2.begin( ); s2_Iter != --s2.end( ); s2_Iter++ )
cout << " " << *s2_Iter << ",";
s2_Iter = --s2.end( );
cout << " " << *s2_Iter << " )." << endl;
s3 = max ( s1, s2 );
cout << "s3 = max ( s1, s2 ) = (";
for ( s3_Iter = s3.begin( ); s3_Iter != --s3.end( ); s3_Iter++ )
cout << " " << *s3_Iter << ",";
s3_Iter = --s3.end( );
cout << " " << *s3_Iter << " )." << endl << endl;
// Comparing vectors with integer elements using the max algorithm
vector<int> v1, v2, v3, v4, v5;
vector<int>::iterator Iter1, Iter2, Iter3, Iter4, Iter5;
int i;
for ( i = 0 ; i <= 2 ; i++ )
v1.push_back( i );
int ii;
for ( ii = 0 ; ii <= 2 ; ii++ )
v2.push_back( ii );
int iii;
for ( iii = 0 ; iii <= 2 ; iii++ )
v3.push_back( 2 * iii );
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
cout << "Vector v2 is ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
cout << "Vector v3 is ( " ;
for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )
cout << *Iter3 << " ";
cout << ")." << endl;
v4 = max ( v1, v2 );
v5 = max ( v1, v3 );
cout << "Vector v4 = max (v1,v2) is ( " ;
for ( Iter4 = v4.begin( ) ; Iter4 != v4.end( ) ; Iter4++ )
cout << *Iter4 << " ";
cout << ")." << endl;
cout << "Vector v5 = max (v1,v3) is ( " ;
for ( Iter5 = v5.begin( ) ; Iter5 != v5.end( ) ; Iter5++ )
cout << *Iter5 << " ";
cout << ")." << endl;
Using integers 6 and -7...
The integer with the greater absolute value is: -7
The integer with the greater value is: 6.
Comparing the members of an initializer_list...
The member with the greater value is: 6
The integer with the greater absolute value is: -7
s1 = ( CInt( 1 ), CInt( 2 ) ).
s2 = ( CInt( 2 ), CInt( 3 ) ).
s3 = max ( s1, s2 ) = ( CInt( 2 ), CInt( 3 ) ).
Vector v1 is ( 0 1 2 ).
Vector v2 is ( 0 1 2 ).
Vector v3 is ( 0 2 4 ).
Vector v4 = max (v1,v2) is ( 0 1 2 ).
Vector v5 = max (v1,v3) is ( 0 2 4 ).
max_element
在指定的範圍內尋找第一個最大項目,其中順序準則可由二元述詞指定。
template<class ForwardIterator>
constexpr ForwardIterator max_element(
ForwardIterator first,
ForwardIterator last );
template<class ForwardIterator, class Compare>
constexpr ForwardIterator max_element(
ForwardIterator first,
ForwardIterator last,
Compare pred );
template<class ExecutionPolicy, class ForwardIterator>
ForwardIterator max_element(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last);
template<class ExecutionPolicy, class ForwardIterator, class Compare>
ForwardIterator max_element(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
Compare pred);
要使用的執行原則。
first
正向迭代器,定址要搜尋最大元素之範圍中第一個元素的位置。
正向迭代器,定址要搜尋最大元素之範圍中最後一個元素之後的位置。
使用者定義的述詞函式物件,定義一個元素小於另一個元素的意義。 比較述詞會採用兩個自變數,而且當第一個專案小於第二個元素false
時,應該傳回 ,否則應該傳回 true
。
正向迭代器,定址所搜尋範圍中第一次出現最大元素的位置。
參考的範圍必須有效;所有指標都必須可以取值,而且在每個序列中,可透過遞增從第一個位置到達最後一個位置。
複雜度是線性的: (last - first) - 1
非空範圍需要比較。
// alg_max_element.cpp
// compile with: /EHsc
#include <vector>
#include <set>
#include <algorithm>
#include <iostream>
#include <ostream>
using namespace std;
class CInt;
ostream& operator<<( ostream& osIn, const CInt& rhs );
class CInt
public:
CInt( int n = 0 ) : m_nVal( n ){}
CInt( const CInt& rhs ) : m_nVal( rhs.m_nVal ){}
CInt& operator=( const CInt& rhs ) {m_nVal =
rhs.m_nVal; return *this;}
bool operator<( const CInt& rhs ) const
{return ( m_nVal < rhs.m_nVal );}
friend ostream& operator<<( ostream& osIn, const CInt& rhs );
private:
int m_nVal;
inline ostream& operator<<(ostream& osIn, const CInt& rhs)
osIn << "CInt( " << rhs.m_nVal << " )";
return osIn;
// Return whether modulus of elem1 is greater than modulus of elem2
bool mod_lesser ( int elem1, int elem2 )
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
int main()
// Searching a set container with elements of type CInt
// for the maximum element
CInt c1 = 1, c2 = 2, c3 = -3;
set<CInt> s1;
set<CInt>::iterator s1_Iter, s1_R1_Iter, s1_R2_Iter;
s1.insert ( c1 );
s1.insert ( c2 );
s1.insert ( c3 );
cout << "s1 = (";
for ( s1_Iter = s1.begin( ); s1_Iter != --s1.end( ); s1_Iter++ )
cout << " " << *s1_Iter << ",";
s1_Iter = --s1.end( );
cout << " " << *s1_Iter << " )." << endl;
s1_R1_Iter = max_element ( s1.begin( ), s1.end( ) );
cout << "The largest element in s1 is: " << *s1_R1_Iter << endl;
cout << endl;
// Searching a vector with elements of type int for the maximum
// element under default less than & mod_lesser binary predicates
vector<int> v1;
vector<int>::iterator v1_Iter, v1_R1_Iter, v1_R2_Iter;
int i;
for ( i = 0 ; i <= 3 ; i++ )
v1.push_back( i );
int ii;
for ( ii = 1 ; ii <= 4 ; ii++ )
v1.push_back( - 2 * ii );
cout << "Vector v1 is ( " ;
for ( v1_Iter = v1.begin( ) ; v1_Iter != v1.end( ) ; v1_Iter++ )
cout << *v1_Iter << " ";
cout << ")." << endl;
v1_R1_Iter = max_element ( v1.begin( ), v1.end( ) );
v1_R2_Iter = max_element ( v1.begin( ), v1.end( ), mod_lesser);
cout << "The largest element in v1 is: " << *v1_R1_Iter << endl;
cout << "The largest element in v1 under the mod_lesser"
<< "\n binary predicate is: " << *v1_R2_Iter << endl;
s1 = ( CInt( -3 ), CInt( 1 ), CInt( 2 ) ).
The largest element in s1 is: CInt( 2 )
Vector v1 is ( 0 1 2 3 -2 -4 -6 -8 ).
The largest element in v1 is: 3
The largest element in v1 under the mod_lesser
binary predicate is: -8
merge
將兩個排序來源範圍內的所有項目結合成單一排序目的範圍,其中順序準則可由二元述詞指定。
template<class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator merge(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result );
template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
OutputIterator merge(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result,
Compare pred );
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class ForwardIterator>
ForwardIterator merge(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
ForwardIterator result);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class ForwardIterator, class Compare>
ForwardIterator merge(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
ForwardIterator result,
Compare pred);
要使用的執行原則。
first1
輸入迭代器,用於定址要結合並排序成單一範圍之兩個排序來源範圍的第一個範圍中,第一個項目的位置。
last1
輸入迭代器,用於定址要結合並排序成單一範圍之兩個排序來源範圍的第一個範圍中,最後一個項目的後面一個位置。
first2
輸入迭代器,用於定址要結合並排序成單一範圍之兩個連續排序來源範圍的第二個範圍中,第一個項目的位置。
last2
輸入迭代器,用於定址要結合並排序成單一範圍之兩個連續排序來源範圍的第二個範圍中,最後一個項目的後面一個位置。
result
輸出迭代器,用於定址目的範圍中第一個項目的位置,在此目的範圍中,兩個來源範圍會結合成單一排序範圍。
使用者定義的述詞函式物件,定義一個元素小於另一個元素的意義。 比較述詞會採用兩個自變數,而且當第一個專案小於第二個專案時,應該傳回 true
, false
否則為 。
輸出迭代器,用於定址排序目的範圍中最後一個項目的後面一個位置。
參考的排序來源範圍必須有效;所有指標都必須可以取值,而且在每個序列中,必須可透過遞增從第一個位置到達最後一個位置。
目的範圍不應該重疊其中一個來源範圍,而且應該足以包含目的地範圍。
每個排序來源範圍必須根據 merge
演算法用來排序結合範圍的相同順序,排列成套用此演算法的前置條件。
這項作業很穩定,因為每個範圍內的元素相對順序會保留在目的範圍中。 演算法不會修改 merge
來源範圍。
輸入反覆運算器的實值類型必須小於可比較的排序。 也就是說,假設有兩個元素,您可以判斷一個小於另一個元素,或者它們相等。 (這裡,對等表示兩者都不小於另一個。此比較會產生無等價專案之間的順序。 當兩個來源範圍中有對等項目時,目的範圍之第一個來源範圍中的項目會優先於第二個範圍中的項目。
演算法的複雜性與大部分比較都是 (last1 - first1) - (last2 - first2) - 1
線性的。
類別list
提供成員函式merge
來合併兩個清單的專案。
// alg_merge.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // For greater<int>( )
#include <iostream>
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser ( int elem1, int elem2 ) {
if (elem1 < 0)
elem1 = - elem1;
if (elem2 < 0)
elem2 = - elem2;
return elem1 < elem2;
int main() {
using namespace std;
vector<int> v1a, v1b, v1 ( 12 );
vector<int>::iterator Iter1a, Iter1b, Iter1;
// Constructing vector v1a and v1b with default less than ordering
int i;
for ( i = 0 ; i <= 5 ; i++ )
v1a.push_back( i );
int ii;
for ( ii =-5 ; ii <= 0 ; ii++ )
v1b.push_back( ii );
cout << "Original vector v1a with range sorted by the\n "
<< "binary predicate less than is v1a = ( " ;
for ( Iter1a = v1a.begin( ) ; Iter1a != v1a.end( ) ; Iter1a++ )
cout << *Iter1a << " ";
cout << ")." << endl;
cout << "Original vector v1b with range sorted by the\n "
<< "binary predicate less than is v1b = ( " ;
for ( Iter1b = v1b.begin( ) ; Iter1b != v1b.end( ) ; Iter1b++ )
cout << *Iter1b << " ";
cout << ")." << endl;
// Constructing vector v2 with ranges sorted by greater
vector<int> v2a ( v1a ) , v2b ( v1b ) , v2 ( v1 );
vector<int>::iterator Iter2a, Iter2b, Iter2;
sort ( v2a.begin( ), v2a.end( ), greater<int>( ) );
sort ( v2b.begin( ), v2b.end( ), greater<int>( ) );
cout << "Original vector v2a with range sorted by the\n "
<< "binary predicate greater is v2a = ( " ;
for ( Iter2a = v2a.begin( ) ; Iter2a != v2a.end( ) ; Iter2a++ )
cout << *Iter2a << " ";
cout << ")." << endl;
cout << "Original vector v2b with range sorted by the\n "
<< "binary predicate greater is v2b = ( " ;
for ( Iter2b = v2b.begin( ) ; Iter2b != v2b.end( ) ; Iter2b++ )
cout << *Iter2b << " ";
cout << ")." << endl;
// Constructing vector v3 with ranges sorted by mod_lesser
vector<int> v3a( v1a ), v3b( v1b ) , v3( v1 );
vector<int>::iterator Iter3a, Iter3b, Iter3;
sort ( v3a.begin( ), v3a.end( ), mod_lesser );
sort ( v3b.begin( ), v3b.end( ), mod_lesser );
cout << "Original vector v3a with range sorted by the\n "
<< "binary predicate mod_lesser is v3a = ( " ;
for ( Iter3a = v3a.begin( ) ; Iter3a != v3a.end( ) ; Iter3a++ )
cout << *Iter3a << " ";
cout << ")." << endl;
cout << "Original vector v3b with range sorted by the\n "
<< "binary predicate mod_lesser is v3b = ( " ;
for ( Iter3b = v3b.begin( ) ; Iter3b != v3b.end( ) ; Iter3b++ )
cout << *Iter3b << " ";
cout << ")." << endl;
// To merge inplace in ascending order with default binary
// predicate less<int>( )
merge ( v1a.begin( ), v1a.end( ), v1b.begin( ), v1b.end( ), v1.begin( ) );
cout << "Merged inplace with default order,\n vector v1mod = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// To merge inplace in descending order, specify binary
// predicate greater<int>( )
merge ( v2a.begin( ), v2a.end( ), v2b.begin( ), v2b.end( ),
v2.begin( ), greater<int>( ) );
cout << "Merged inplace with binary predicate greater specified,\n "
<< "vector v2mod = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
// Applying A user-defined (UD) binary predicate mod_lesser
merge ( v3a.begin( ), v3a.end( ), v3b.begin( ), v3b.end( ),
v3.begin( ), mod_lesser );
cout << "Merged inplace with binary predicate mod_lesser specified,\n "
<< "vector v3mod = ( " ; ;
for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )
cout << *Iter3 << " ";
cout << ")." << endl;
Original vector v1a with range sorted by the
binary predicate less than is v1a = ( 0 1 2 3 4 5 ).
Original vector v1b with range sorted by the
binary predicate less than is v1b = ( -5 -4 -3 -2 -1 0 ).
Original vector v2a with range sorted by the
binary predicate greater is v2a = ( 5 4 3 2 1 0 ).
Original vector v2b with range sorted by the
binary predicate greater is v2b = ( 0 -1 -2 -3 -4 -5 ).
Original vector v3a with range sorted by the
binary predicate mod_lesser is v3a = ( 0 1 2 3 4 5 ).
Original vector v3b with range sorted by the
binary predicate mod_lesser is v3b = ( 0 -1 -2 -3 -4 -5 ).
Merged inplace with default order,
vector v1mod = ( -5 -4 -3 -2 -1 0 0 1 2 3 4 5 ).
Merged inplace with binary predicate greater specified,
vector v2mod = ( 5 4 3 2 1 0 0 -1 -2 -3 -4 -5 ).
Merged inplace with binary predicate mod_lesser specified,
vector v3mod = ( 0 0 1 -1 2 -2 3 -3 4 -4 5 -5 ).
比較兩個物件並傳回兩者較小者,其中順序準則可由二元述詞指定。
template<class Type>
constexpr const Type& min(
const Type& left,
const Type& right);
template<class Type, class Pr>
constexpr const Type& min(
const Type& left,
const Type& right,
BinaryPredicate pred);
template<class Type>
constexpr Type min(
initializer_list<Type> ilist);
template<class Type, class Pr>
constexpr Type min(
initializer_list<Type> ilist,
BinaryPredicate pred);
正在比較的兩個物件之第一個。
right
正在比較的兩個物件之第二個。
用來比較兩個物件的二元述詞。
inlist
initializer_list
,其中包含要比較的成員。
除非兩者一樣大,否則會傳回兩個物件中較小的一個;在此情況下,它會傳回兩個物件的第一個。 initializer_list
指定 時,它會傳回清單中最少的物件。
min
是不尋常的演算法,因為它將物件做為參數傳遞。 大部分 C++ 標準程式庫演算法可對某範圍的元素作業,其位置由迭代器作為參數傳遞來加以指定。 如果您需要使用項目範圍的函式, 請使用 min_element
。 constexpr
已在 Visual Studio 2017 的多載上 initializer_list
啟用。
// alg_min.cpp
// compile with: /EHsc
#include <vector>
#include <set>
#include <algorithm>
#include <iostream>
#include <ostream>
using namespace std;
class CInt;
ostream& operator<<( ostream& osIn, const CInt& rhs );
class CInt
public:
CInt( int n = 0 ) : m_nVal( n ){}
CInt( const CInt& rhs ) : m_nVal( rhs.m_nVal ){}
CInt& operator=( const CInt& rhs ) {m_nVal =
rhs.m_nVal; return *this;}
bool operator<( const CInt& rhs ) const
{return ( m_nVal < rhs.m_nVal );}
friend ostream& operator<<(ostream& osIn, const CInt& rhs);
private:
int m_nVal;
inline ostream& operator<<( ostream& osIn, const CInt& rhs )
osIn << "CInt( " << rhs.m_nVal << " )";
return osIn;
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser ( int elem1, int elem2 )
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
int main()
// Comparing integers directly using the min algorithm with
// binary predicate mod_lesser & with default less than
int a = 6, b = -7, c = 7 ;
const int& result1 = min ( a, b, mod_lesser );
const int& result2 = min ( b, c );
cout << "The mod_lesser of the integers 6 & -7 is: "
<< result1 << "." << endl;
cout << "The lesser of the integers -7 & 7 is: "
<< result2 << "." << endl;
cout << endl;
// Comparing the members of an initializer_list
const int& result3 = min({ a, c });
const int& result4 = min({ a, b }, mod_lesser);
cout << "The lesser of the integers 6 & 7 is: "
<< result3 << "." << endl;
cout << "The mod_lesser of the integers 6 & -7 is: "
<< result4 << "." << endl;
cout << endl;
// Comparing set containers with elements of type CInt
// using the min algorithm
CInt c1 = 1, c2 = 2, c3 = 3;
set<CInt> s1, s2, s3;
set<CInt>::iterator s1_Iter, s2_Iter, s3_Iter;
s1.insert ( c1 );
s1.insert ( c2 );
s2.insert ( c2 );
s2.insert ( c3 );
cout << "s1 = (";
for ( s1_Iter = s1.begin( ); s1_Iter != --s1.end( ); s1_Iter++ )
cout << " " << *s1_Iter << ",";
s1_Iter = --s1.end( );
cout << " " << *s1_Iter << " )." << endl;
cout << "s2 = (";
for ( s2_Iter = s2.begin( ); s2_Iter != --s2.end( ); s2_Iter++ )
cout << " " << *s2_Iter << ",";
s2_Iter = --s2.end( );
cout << " " << *s2_Iter << " )." << endl;
s3 = min ( s1, s2 );
cout << "s3 = min ( s1, s2 ) = (";
for ( s3_Iter = s3.begin( ); s3_Iter != --s3.end( ); s3_Iter++ )
cout << " " << *s3_Iter << ",";
s3_Iter = --s3.end( );
cout << " " << *s3_Iter << " )." << endl << endl;
// Comparing vectors with integer elements using min algorithm
vector<int> v1, v2, v3, v4, v5;
vector<int>::iterator Iter1, Iter2, Iter3, Iter4, Iter5;
int i;
for ( i = 0 ; i <= 2 ; i++ )
v1.push_back( i );
int ii;
for ( ii = 0 ; ii <= 2 ; ii++ )
v2.push_back( ii );
int iii;
for ( iii = 0 ; iii <= 2 ; iii++ )
v3.push_back( 2 * iii );
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
cout << "Vector v2 is ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
cout << "Vector v3 is ( " ;
for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )
cout << *Iter3 << " ";
cout << ")." << endl;
v4 = min ( v1, v2 );
v5 = min ( v1, v3 );
cout << "Vector v4 = min ( v1,v2 ) is ( " ;
for ( Iter4 = v4.begin( ) ; Iter4 != v4.end( ) ; Iter4++ )
cout << *Iter4 << " ";
cout << ")." << endl;
cout << "Vector v5 = min ( v1,v3 ) is ( " ;
for ( Iter5 = v5.begin( ) ; Iter5 != v5.end( ) ; Iter5++ )
cout << *Iter5 << " ";
cout << ")." << endl;
The mod_lesser of the integers 6 & -7 is: 6.
The lesser of the integers -7 & 7 is: -7.
The lesser of the integers 6 & 7 is: 6.The mod_lesser of the integers 6 & -7 is: 6.
s1 = ( CInt( 1 ), CInt( 2 ) ).
s2 = ( CInt( 2 ), CInt( 3 ) ).
s3 = min ( s1, s2 ) = ( CInt( 1 ), CInt( 2 ) ).
Vector v1 is ( 0 1 2 ).
Vector v2 is ( 0 1 2 ).
Vector v3 is ( 0 2 4 ).
Vector v4 = min ( v1,v2 ) is ( 0 1 2 ).
Vector v5 = min ( v1,v3 ) is ( 0 1 2 ).
min_element
在指定的範圍內尋找第一個最小項目,其中順序準則可由二元述詞指定。
template<class ForwardIterator>
constexpr ForwardIterator min_element(
ForwardIterator first,
ForwardIterator last );
template<class ForwardIterator, class Compare>
constexpr ForwardIterator min_element(
ForwardIterator first,
ForwardIterator last,
Compare pred);
template<class ExecutionPolicy, class ForwardIterator>
ForwardIterator min_element(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last);
template<class ExecutionPolicy, class ForwardIterator, class Compare>
ForwardIterator min_element(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
Compare pred);
要使用的執行原則。
first
正向迭代器,定址要搜尋最小元素之範圍中第一個元素的位置。
正向迭代器,定址要搜尋最小元素之範圍中最後一個元素之後的位置。
使用者定義的述詞函式物件,定義一個元素小於另一個元素的意義。 比較述詞會採用兩個自變數,而且當第一個專案小於第二個專案時,應該傳回 true
, false
否則為 。
正向迭代器,定址所搜尋範圍中第一次出現最小元素的位置。
參考的範圍必須有效;所有指標都必須可以取值,而且在每個序列中,可透過遞增從第一個位置到達最後一個位置。
複雜度是線性的: (last - first) - 1
非空範圍需要比較。
// alg_min_element.cpp
// compile with: /EHsc
#include <vector>
#include <set>
#include <algorithm>
#include <iostream>
#include <ostream>
using namespace std;
class CInt;
ostream& operator<<( ostream& osIn, const CInt& rhs );
class CInt
public:
CInt( int n = 0 ) : m_nVal( n ){}
CInt( const CInt& rhs ) : m_nVal( rhs.m_nVal ){}
CInt& operator=( const CInt& rhs ) {m_nVal =
rhs.m_nVal; return *this;}
bool operator<( const CInt& rhs ) const
{return ( m_nVal < rhs.m_nVal );}
friend ostream& operator<<( ostream& osIn, const CInt& rhs );
private:
int m_nVal;
inline ostream& operator<<( ostream& osIn, const CInt& rhs )
osIn << "CInt( " << rhs.m_nVal << " )";
return osIn;
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser ( int elem1, int elem2 )
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
int main()
// Searching a set container with elements of type CInt
// for the minimum element
CInt c1 = 1, c2 = 2, c3 = -3;
set<CInt> s1;
set<CInt>::iterator s1_Iter, s1_R1_Iter, s1_R2_Iter;
s1.insert ( c1 );
s1.insert ( c2 );
s1.insert ( c3 );
cout << "s1 = (";
for ( s1_Iter = s1.begin( ); s1_Iter != --s1.end( ); s1_Iter++ )
cout << " " << *s1_Iter << ",";
s1_Iter = --s1.end( );
cout << " " << *s1_Iter << " )." << endl;
s1_R1_Iter = min_element ( s1.begin( ), s1.end( ) );
cout << "The smallest element in s1 is: " << *s1_R1_Iter << endl;
cout << endl;
// Searching a vector with elements of type int for the maximum
// element under default less than & mod_lesser binary predicates
vector<int> v1;
vector<int>::iterator v1_Iter, v1_R1_Iter, v1_R2_Iter;
int i;
for ( i = 0 ; i <= 3 ; i++ )
v1.push_back( i );
int ii;
for ( ii = 1 ; ii <= 4 ; ii++ )
v1.push_back( - 2 * ii );
cout << "Vector v1 is ( " ;
for ( v1_Iter = v1.begin( ) ; v1_Iter != v1.end( ) ; v1_Iter++ )
cout << *v1_Iter << " ";
cout << ")." << endl;
v1_R1_Iter = min_element ( v1.begin( ), v1.end( ) );
v1_R2_Iter = min_element ( v1.begin( ), v1.end( ), mod_lesser);
cout << "The smallest element in v1 is: " << *v1_R1_Iter << endl;
cout << "The smallest element in v1 under the mod_lesser"
<< "\n binary predicate is: " << *v1_R2_Iter << endl;
s1 = ( CInt( -3 ), CInt( 1 ), CInt( 2 ) ).
The smallest element in s1 is: CInt( -3 )
Vector v1 is ( 0 1 2 3 -2 -4 -6 -8 ).
The smallest element in v1 is: -8
The smallest element in v1 under the mod_lesser
binary predicate is: 0
minmax_element
在一個呼叫中執行 min_element
和 max_element
所執行的工作。
template<class ForwardIterator>
constexpr pair<ForwardIterator, ForwardIterator> minmax_element(
ForwardIterator first,
ForwardIterator last);
template<class ForwardIterator, class Compare>
constexpr pair<ForwardIterator, ForwardIterator> minmax_element(
ForwardIterator first,
ForwardIterator last,
Compare pred);
template<class ExecutionPolicy, class ForwardIterator>
pair<ForwardIterator, ForwardIterator> minmax_element(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last);
template<class ExecutionPolicy, class ForwardIterator, class Compare>
pair<ForwardIterator, ForwardIterator> minmax_element(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
Compare pred);
要使用的執行原則。
first
正向迭代器,表示範圍開頭。
正向迭代器,表示範圍結尾。
使用者定義的述詞函式對象,定義某個元素小於另一個元素的感知。 比較述詞會採用兩個自變數,而且當第一個自變數小於第二個自變數時,應該傳回 ,false
否則傳回 true
。
pair<ForwardIterator, ForwardIterator>( min_element(first, last), max_element(first, last))
.
第一個範本函式會傳回
pair<ForwardIterator,ForwardIterator>(min_element(first,last), max_element(first,last))
.
第二個範本函式的行為相同,差異在於它會將 operator<(X, Y)
取代為 pred(X, Y)
。
如果序列不是空的,此函式最多執行 3 * (last - first - 1) / 2
次比較。
minmax
比較兩個輸入參數並作為一組傳回,從小排到大。
template<class Type>
constexpr pair<const Type&, const Type&> minmax(
const Type& left,
const Type& right);
template<class Type, class BinaryPredicate>
constexpr pair<const Type&, const Type&> minmax(
const Type& left,
const Type& right,
BinaryPredicate pred);
template<class Type>
constexpr pair<Type&, Type&> minmax(
initializer_list<Type> ilist);
template<class Type, class BinaryPredicate>
constexpr pair<Type&, Type&> minmax(
initializer_list<Type> ilist,
BinaryPredicate pred);
正在比較的兩個物件之第一個。
right
正在比較的兩個物件之第二個。
用來比較兩個物件的二元述詞。
inlist
initializer_list
,其中包含要比較的成員。
如果 right
小於 left
,則第一個範本函式會傳回 pair<const Type&, const Type&>( right, left )
。 否則會傳回 pair<const Type&, const Type&>( left, right )
。
第二個成員函式會傳回一個配對,其中,透過述詞 pred
比較時,第一個元素較小,而第二個較大。
其餘範本函式的行為相同,差異在於它們會將 left
和 right
參數取代為 inlist
。
此函式只會執行一個比較。
mismatch
逐一比較兩個範圍的每個項目,找出差異發生的第一個位置。
使用 C++14 程式代碼中的雙範圍多載,因為如果第二個範圍超過第一個範圍,則只有單一反覆運算器的多載不會偵測到差異。 如果第二個範圍比第一個範圍短,這些多載將會導致未定義的行為。
template<class InputIterator1, class InputIterator2>
pair<InputIterator1, InputIterator2>>
mismatch(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2 );
template<class InputIterator1, class InputIterator2, class BinaryPredicate> pair<InputIterator1, InputIterator2>>
mismatch(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
BinaryPredicate pred );
//C++14
template<class InputIterator1, class InputIterator2>
pair<InputIterator1, InputIterator2>>
mismatch(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2 );
template<class InputIterator1, class InputIterator2, class BinaryPredicate> pair<InputIterator1, InputIterator2>>
mismatch(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
BinaryPredicate pred);
//C++17
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
pair<ForwardIterator1, ForwardIterator2>
mismatch(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
pair<ForwardIterator1, ForwardIterator2>
mismatch(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
BinaryPredicate pred);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
pair<ForwardIterator1, ForwardIterator2>
mismatch(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
pair<ForwardIterator1, ForwardIterator2>
mismatch(
ExecutionPolicy&& exec,
ForwardIterator1 first1,
ForwardIterator1 last1,
ForwardIterator2 first2,
ForwardIterator2 last2,
BinaryPredicate pred);
要使用的執行原則。
first1
輸入迭代器,定址要測試的第一個範圍中第一個項目的位置。
last1
輸入迭代器,定址要測試的第一個範圍中最後一個項目的後面一個位置。
first2
輸入迭代器,定址要測試的第二個範圍中第一個項目的位置。
last2
輸入迭代器,定址要測試的第二個範圍中最後一個項目的後面一個位置。
使用者定義述詞函式物件,可比較每個範圍中的目前專案,並判斷它們是否相等。 當滿足且false
不符合時,它會傳回 true
。
傳回一對反覆運算器,尋址兩個範圍中不相符的位置。 第一個元件反覆運算器會指向第一個範圍中的位置。 第二個元件反覆運算器指向第二個範圍中的位置。 如果比較範圍中的元素之間沒有差異,或者第二個版本中的二進位述詞是由兩個範圍中的所有元素配對所滿足,則第一個元件反覆運算器會指向第一個範圍中最後一個項目之後的位置,而第二個元件迭代器指向第二個範圍中測試的最後元素之後的位置。
第一個樣板函式會假設範圍中從 first2 開始的項目數,與 [first1, last1) 指定的範圍中的項目數相同。 如果第二個範圍中有更多,則會忽略它們;如果較少,則未定義的行為將會產生。
要搜尋的範圍必須有效;所有迭代器都必須可以取值,而且可透過遞增從第一個位置到達最後一個位置。
在較短範圍內包含的項目數中,演算法的時間複雜性呈線性。
用戶定義述詞不需要強加其操作數之間對稱、反射和可轉移的等價關聯性。
下列範例示範如何使用不相符。 顯示 C++03 多載只是為了示範可能產生非預期的結果。
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
#include <string>
#include <utility>
using namespace std;
// Return whether first element is twice the second
// Note that this isn't a symmetric, reflexive, and transitive equivalence.
// mismatch and equal accept such predicates, but is_permutation doesn't.
bool twice(int elem1, int elem2)
return elem1 == elem2 * 2;
void PrintResult(const string& msg, const pair<vector<int>::iterator, vector<int>::iterator>& result,
const vector<int>& left, const vector<int>& right)
// If either iterator stops before reaching the end of its container,
// it means a mismatch was detected.
if (result.first != left.end() || result.second != right.end())
string leftpos(result.first == left.end() ? "end" : to_string(*result.first));
string rightpos(result.second == right.end() ? "end" : to_string(*result.second));
cout << msg << "mismatch. Left iterator at " << leftpos
<< " right iterator at " << rightpos << endl;
cout << msg << " match." << endl;
int main()
vector<int> vec_1{ 0, 5, 10, 15, 20, 25 };
vector<int> vec_2{ 0, 5, 10, 15, 20, 25, 30 };
// Testing different length vectors for mismatch (C++03)
auto match_vecs = mismatch(vec_1.begin(), vec_1.end(), vec_2.begin());
bool is_mismatch = match_vecs.first != vec_1.end();
cout << "C++03: vec_1 and vec_2 are a mismatch: " << boolalpha << is_mismatch << endl;
// Using dual-range overloads:
// Testing different length vectors for mismatch (C++14)
match_vecs = mismatch(vec_1.begin(), vec_1.end(), vec_2.begin(), vec_2.end());
PrintResult("C++14: vec_1 and vec_2: ", match_vecs, vec_1, vec_2);
// Identify point of mismatch between vec_1 and modified vec_2.
vec_2[3] = 42;
match_vecs = mismatch(vec_1.begin(), vec_1.end(), vec_2.begin(), vec_2.end());
PrintResult("C++14 vec_1 v. vec_2 modified: ", match_vecs, vec_1, vec_2);
// Test vec_3 and vec_4 for mismatch under the binary predicate twice (C++14)
vector<int> vec_3{ 10, 20, 30, 40, 50, 60 };
vector<int> vec_4{ 5, 10, 15, 20, 25, 30 };
match_vecs = mismatch(vec_3.begin(), vec_3.end(), vec_4.begin(), vec_4.end(), twice);
PrintResult("vec_3 v. vec_4 with pred: ", match_vecs, vec_3, vec_4);
vec_4[5] = 31;
match_vecs = mismatch(vec_3.begin(), vec_3.end(), vec_4.begin(), vec_4.end(), twice);
PrintResult("vec_3 v. modified vec_4 with pred: ", match_vecs, vec_3, vec_4);
// Compare a vector<int> to a list<int>
list<int> list_1{ 0, 5, 10, 15, 20, 25 };
auto match_vec_list = mismatch(vec_1.begin(), vec_1.end(), list_1.begin(), list_1.end());
is_mismatch = match_vec_list.first != vec_1.end() || match_vec_list.second != list_1.end();
cout << "vec_1 and list_1 are a mismatch: " << boolalpha << is_mismatch << endl;
char c;
cout << "Press a key" << endl;
cin >> c;
C++03: vec_1 and vec_2 are a mismatch: false
C++14: vec_1 and vec_2: mismatch. Left iterator at end right iterator at 30
C++14 vec_1 v. vec_2 modified: mismatch. Left iterator at 15 right iterator at 42
C++14 vec_3 v. vec_4 with pred: match.
C++14 vec_3 v. modified vec_4 with pred: mismatch. Left iterator at 60 right iterator at 31
C++14: vec_1 and list_1 are a mismatch: false
Press a key
<alg> move
移動與所指定範圍相關聯的項目。
template<class InputIterator, class OutputIterator>
OutputIterator move(
InputIterator first,
InputIterator last,
OutputIterator dest);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 move(
ExecutionPolicy&& exec,
ForwardIterator1 first,
ForwardIterator1 last,
ForwardIterator2 result);
要使用的執行原則。
first
輸入迭代器,表示項目移動範圍的開始位置。
輸入迭代器,表示項目移動範圍的結束位置。
要包含已移動項目的輸出迭代器。
這個範本函式會針對範圍 [0, last - first)
中的每個 N
評估一次 *(dest + N) = move(*(first + N))
,才能嚴格地從最低值開始增加 N
值。 然後它會傳回 dest + N
。 如果 dest
和 first
指定儲存區域,dest
不得在範圍 [first, last)
內。
move_backward
將一個迭代器的項目移至另一個迭代器。 從指定範圍內的最後一個項目開始移動,並以該範圍內的第一個項目結束。
template<class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2 move_backward(
BidirectionalIterator1 first,
BidirectionalIterator1 last,
BidirectionalIterator2 destEnd);
first
迭代器,表示要從中移動元素的範圍開始。
迭代器,表示要從中移動元素的範圍結尾。 此元素不會移動。
destEnd
雙向迭代器,在目的範圍中越過最後一個項目的位置定址。
這個範本函式會針對範圍 [0, last - first)
中的每個 N
評估一次 *(destEnd - N - 1) = move(*(last - N - 1))
,才能嚴格地從最低值開始增加 N
值。 然後它會傳回 destEnd - (last - first)
。 如果 destEnd
和 first
指定儲存區域,destEnd
不得在範圍 [first, last)
內。
move
和 move_backward
的功能等同於搭配使用 copy
和 copy_backward
與移動迭代器。
next_permutation
將範圍中的元素重新排序,使原始順序在語彙上取代為下一個更大的排列,如果存在的話。 下一步的語彙感可以使用二元述詞來指定。
template<class BidirectionalIterator>
bool next_permutation(
BidirectionalIterator first,
BidirectionalIterator last);
template<class BidirectionalIterator, class BinaryPredicate>
bool next_permutation(
BidirectionalIterator first,
BidirectionalIterator last,
BinaryPredicate pred);
first
雙向迭代器,指向要排列之範圍中第一個元素的位置。
雙向迭代器,指向要排列之範圍中最後一個元素之後的位置。
使用者定義的述詞函式物件,定義順序中後續元素所要符合的比較準則。 二元述詞會採用兩個引數,並且在符合時傳回 true
,不符合時則傳回 false
。
true
如果語彙下一個排列存在且已取代範圍的原始順序,則為 ;否則 false
,在此情況下,排序會轉換成語彙最小排列。
參考的範圍必須有效;所有指標都必須可以取值,而且在序列中,可透過遞增從第一個位置到達最後一個位置。
默認的二進位述詞小於 ,而且範圍中的元素必須小於可比較,以確保下一個排列已妥善定義。
複雜度是線性的,最多 (last - first) / 2
交換。
// alg_next_perm.cpp
// compile with: /EHsc
#include <vector>
#include <deque>
#include <algorithm>
#include <iostream>
#include <ostream>
using namespace std;
class CInt;
ostream& operator<<( ostream& osIn, const CInt& rhs );
class CInt
public:
CInt( int n = 0 ) : m_nVal( n ) {}
CInt( const CInt& rhs ) : m_nVal( rhs.m_nVal ) {}
CInt& operator=( const CInt& rhs ) {m_nVal =
rhs.m_nVal; return *this;}
bool operator<( const CInt& rhs ) const
{ return ( m_nVal < rhs.m_nVal ); }
friend ostream& operator<<( ostream& osIn, const CInt& rhs );
private:
int m_nVal;
inline ostream& operator<<( ostream& osIn, const CInt& rhs )
osIn << "CInt( " << rhs.m_nVal << " )";
return osIn;
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser ( int elem1, int elem2 )
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 < elem2;
int main()
// Reordering the elements of type CInt in a deque
// using the prev_permutation algorithm
CInt c1 = 5, c2 = 1, c3 = 10;
bool deq1Result;
deque<CInt> deq1, deq2, deq3;
deque<CInt>::iterator d1_Iter;
deq1.push_back ( c1 );
deq1.push_back ( c2 );
deq1.push_back ( c3 );
cout << "The original deque of CInts is deq1 = (";
for ( d1_Iter = deq1.begin( ); d1_Iter != --deq1.end( ); d1_Iter++ )
cout << " " << *d1_Iter << ",";
d1_Iter = --deq1.end( );
cout << " " << *d1_Iter << " )." << endl;
deq1Result = next_permutation ( deq1.begin( ), deq1.end( ) );
if ( deq1Result )
cout << "The lexicographically next permutation "
<< "exists and has\nreplaced the original "
<< "ordering of the sequence in deq1." << endl;
cout << "The lexicographically next permutation doesn't "
<< "exist\n and the lexicographically "
<< "smallest permutation\n has replaced the "
<< "original ordering of the sequence in deq1." << endl;
cout << "After one application of next_permutation,\n deq1 = (";
for ( d1_Iter = deq1.begin( ); d1_Iter != --deq1.end( ); d1_Iter++ )
cout << " " << *d1_Iter << ",";
d1_Iter = --deq1.end( );
cout << " " << *d1_Iter << " )." << endl << endl;
// Permuting vector elements with binary function mod_lesser
vector<int> v1;
vector<int>::iterator Iter1;
int i;
for ( i = -3 ; i <= 3 ; i++ )
v1.push_back( i );
cout << "Vector v1 is ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
next_permutation ( v1.begin( ), v1.end( ), mod_lesser );
cout << "After the first next_permutation, vector v1 is:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
int iii = 1;
while ( iii <= 5 ) {
next_permutation ( v1.begin( ), v1.end( ), mod_lesser );
cout << "After another next_permutation of vector v1,\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ;Iter1 ++ )
cout << *Iter1 << " ";
cout << ")." << endl;
iii++;
The original deque of CInts is deq1 = ( CInt( 5 ), CInt( 1 ), CInt( 10 ) ).
The lexicographically next permutation exists and has
replaced the original ordering of the sequence in deq1.
After one application of next_permutation,
deq1 = ( CInt( 5 ), CInt( 10 ), CInt( 1 ) ).
Vector v1 is ( -3 -2 -1 0 1 2 3 ).
After the first next_permutation, vector v1 is:
v1 = ( -3 -2 -1 0 1 3 2 ).
After another next_permutation of vector v1,
v1 = ( -3 -2 -1 0 2 1 3 ).
After another next_permutation of vector v1,
v1 = ( -3 -2 -1 0 2 3 1 ).
After another next_permutation of vector v1,
v1 = ( -3 -2 -1 0 3 1 2 ).
After another next_permutation of vector v1,
v1 = ( -3 -2 -1 0 3 2 1 ).
After another next_permutation of vector v1,
v1 = ( -3 -2 -1 1 0 2 3 ).
nth_element
分割元素範圍,正確尋找 符合這些準則之範圍中序列的第 n個元素:其前面的所有元素都小於或等於它,且其後面的所有元素都大於或等於它。
template<class RandomAccessIterator>
void nth_element(
RandomAccessIterator first,
RandomAccessIterator nth,
RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
void nth_element(
RandomAccessIterator first,
RandomAccessIterator nth,
RandomAccessIterator last,
Compare pred);
template<class ExecutionPolicy, class RandomAccessIterator>
void nth_element(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator nth,
RandomAccessIterator last);
template<class ExecutionPolicy, class RandomAccessIterator, class Compare>
void nth_element(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator nth,
RandomAccessIterator last,
Compare pred);
要使用的執行原則。
first
隨機存取迭代器,定址要分割之範圍中第一個元素的位置。
隨機存取迭代器,定址要在磁碟分割界限上正確排序之元素的位置。
隨機存取迭代器,定址要分割之範圍中最後一個元素之後的位置。
使用者定義的述詞函式物件,定義順序中後續元素所要符合的比較準則。 比較述詞會採用兩個自變數,並在滿足時和false
未滿足時傳回 true
。
參考的範圍必須有效;所有指標都必須可以取值,而且在序列中,可透過遞增從第一個位置到達最後一個位置。
演算法nth_element
不保證第 n個元素的任一端中的元素會排序。 因此,其保證比 partial_sort
少,它會排序某個所選元素以下範圍內的元素,而且在不需要下限範圍的排序時,可以做為較快的替代 partial_sort
方式。
如果任一個都不小於另一個,則元素對等,但不一定相等。
排序複雜度的平均是相對於 last - first
的線性。
// alg_nth_elem.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // For greater<int>( )
#include <iostream>
// Return whether first element is greater than the second
bool UDgreater ( int elem1, int elem2 ) {
return elem1 > elem2;
int main() {
using namespace std;
vector<int> v1;
vector<int>::iterator Iter1;
int i;
for ( i = 0 ; i <= 5 ; i++ )
v1.push_back( 3 * i );
int ii;
for ( ii = 0 ; ii <= 5 ; ii++ )
v1.push_back( 3 * ii + 1 );
int iii;
for ( iii = 0 ; iii <= 5 ; iii++ )
v1.push_back( 3 * iii +2 );
cout << "Original vector:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
nth_element(v1.begin( ), v1.begin( ) + 3, v1.end( ) );
cout << "Position 3 partitioned vector:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// To sort in descending order, specify binary predicate
nth_element( v1.begin( ), v1.begin( ) + 4, v1.end( ),
greater<int>( ) );
cout << "Position 4 partitioned (greater) vector:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
random_shuffle( v1.begin( ), v1.end( ) );
cout << "Shuffled vector:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// A user-defined (UD) binary predicate can also be used
nth_element( v1.begin( ), v1.begin( ) + 5, v1.end( ), UDgreater );
cout << "Position 5 partitioned (UDgreater) vector:\n v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
v1 = ( 0 3 6 9 12 15 1 4 7 10 13 16 2 5 8 11 14 17 )
Position 3 partitioned vector:
v1 = ( 1 0 2 3 8 5 9 4 7 6 10 16 13 15 12 11 14 17 )
Position 4 partitioned (greater) vector:
v1 = ( 16 17 14 15 13 12 11 9 7 8 10 6 1 4 5 3 2 0 )
Shuffled vector:
v1 = ( 13 10 6 3 5 2 0 17 11 8 15 9 7 14 16 1 12 4 )
Position 5 partitioned (UDgreater) vector:
v1 = ( 14 17 15 16 13 12 10 11 9 8 0 2 7 5 3 1 6 4 )
none_of
當條件從未出現在指定的範圍中的項目時,傳回 true
。
template<class InputIterator, class UnaryPredicate>
bool none_of(
InputIterator first,
InputIterator last,
UnaryPredicate pred);
template <class ExecutionPolicy, class ForwardIterator, class UnaryPredicate>
bool none_of(
ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
UnaryPredicate pred);
要使用的執行原則。
first
輸入迭代器,表示開始檢查條件之某範圍元素的位置。
輸入迭代器,表示某範圍元素的結尾。
要測試的條件。 此測試是由定義條件的使用者定義述詞函式物件所提供。 一元述詞接受單一自變數並傳 true
回 或 false
。
true
如果指定的範圍內至少偵測到一次條件,以及false
偵測到條件,則傳回 。
針對範圍 [0, last - first)
中的某個 N
,只有在述詞 pred(*(first + N))
一律是 false
時,這個範本函式才會傳回 true
。
partial_sort
將範圍中較小元素的指定數目排列成非遞升順序。 二元述詞可能會提供排序準則。
template<class RandomAccessIterator>
void partial_sort(
RandomAccessIterator first,
RandomAccessIterator sortEnd,
RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
void partial_sort(
RandomAccessIterator first,
RandomAccessIterator sortEnd,
RandomAccessIterator last
Compare pred);
template<class ExecutionPolicy, class RandomAccessIterator>
void partial_sort(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator middle,
RandomAccessIterator last);
template<class ExecutionPolicy, class RandomAccessIterator, class Compare>
void partial_sort(
ExecutionPolicy&& exec,
RandomAccessIterator first,
RandomAccessIterator middle,
RandomAccessIterator last,
Compare pred);
要使用的執行原則。