STL-algorithm-3

news/2024/10/18 2:30:16/

Partitions:

is_partitioned

template <class InputIterator, class UnaryPredicate>  bool is_partitioned (InputIterator first, InputIterator last, UnaryPredicate pred);

如果pred返回true的范围[first,last)中的所有元素都在其返回false的元素之前,则返回true。 如果范围为空,函数将返回true。

template <class InputIterator, class UnaryPredicate>bool is_partitioned (InputIterator first, InputIterator last, UnaryPredicate pred)
{while (first!=last && pred(*first)) {++first;}while (first!=last) {if (pred(*first)) return false;++first;}return true;
}
// is_partitioned example
#include <iostream>     // std::cout
#include <algorithm>    // std::is_partitioned
#include <array>        // std::arraybool IsOdd (int i) { return (i%2)==1; }int main () {std::array<int,7> foo {1,2,3,4,5,6,7};// print contents:std::cout << "foo:"; for (int& x:foo) std::cout << ' ' << x;if ( std::is_partitioned(foo.begin(),foo.end(),IsOdd) )std::cout << " (partitioned)\n";elsestd::cout << " (not partitioned)\n";// partition array:std::partition (foo.begin(),foo.end(),IsOdd);// print contents again:std::cout << "foo:"; for (int& x:foo) std::cout << ' ' << x;if ( std::is_partitioned(foo.begin(),foo.end(),IsOdd) )std::cout << " (partitioned)\n";elsestd::cout << " (not partitioned)\n";return 0;
}
Possible output:
foo: 1 2 3 4 5 6 7 (not partitioned)
foo: 1 7 3 5 4 6 2 (partitioned)

partition

重新排列范围[first,last)中的元素,使pred返回true的所有元素都在其返回false的所有元素之前。迭代器返回的点指向第二组的第一个元素。

每组内的相对排序不一定与调用前相同。请参阅stable_partition,了解具有类似行为但在每个组中具有稳定排序的函数。

template <class BidirectionalIterator, class UnaryPredicate>BidirectionalIterator partition (BidirectionalIterator first,BidirectionalIterator last, UnaryPredicate pred)
{while (first!=last) {while (pred(*first)) {++first;if (first==last) return first;}do {--last;if (first==last) return first;} while (!pred(*last));swap (*first,*last);++first;}return first;
}
// partition algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::partition
#include <vector>       // std::vectorbool IsOdd (int i) { return (i%2)==1; }int main () {std::vector<int> myvector;// set some values:for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9std::vector<int>::iterator bound;bound = std::partition (myvector.begin(), myvector.end(), IsOdd);// print out content:std::cout << "odd elements:";for (std::vector<int>::iterator it=myvector.begin(); it!=bound; ++it)std::cout << ' ' << *it;std::cout << '\n';std::cout << "even elements:";for (std::vector<int>::iterator it=bound; it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0;
}
Possible output:
odd elements: 1 9 3 7 5
even elements: 6 4 8 2

stable_partition

重新排列范围[first,last)中的元素,使得pred返回true的所有元素都在其返回false的所有元素之前,并且与函数partition不同,每个组中元素的相对顺序都得到了保留。

// stable_partition example
#include <iostream>     // std::cout
#include <algorithm>    // std::stable_partition
#include <vector>       // std::vectorbool IsOdd (int i) { return (i%2)==1; }int main () {std::vector<int> myvector;// set some values:for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9std::vector<int>::iterator bound;bound = std::stable_partition (myvector.begin(), myvector.end(), IsOdd);// print out content:std::cout << "odd elements:";for (std::vector<int>::iterator it=myvector.begin(); it!=bound; ++it)std::cout << ' ' << *it;std::cout << '\n';std::cout << "even elements:";for (std::vector<int>::iterator it=bound; it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0;
}Output:
odd elements: 1 3 5 7 9
even elements: 2 4 6 8

partition_copy

将pred返回true的范围[first,last)中的元素复制到result_true所指向的范围中,将未返回true的元素复制在result_false所指向范围中。

template <class InputIterator, class OutputIterator1,class OutputIterator2, class UnaryPredicate pred>pair<OutputIterator1,OutputIterator2>partition_copy (InputIterator first, InputIterator last,OutputIterator1 result_true, OutputIterator2 result_false,UnaryPredicate pred)
{while (first!=last) {if (pred(*first)) {*result_true = *first;++result_true;}else {*result_false = *first;++result_false;}++first;}return std::make_pair (result_true,result_false);
}
// partition_copy example
#include <iostream>     // std::cout
#include <algorithm>    // std::partition_copy, std::count_if
#include <vector>       // std::vectorbool IsOdd (int i) { return (i%2)==1; }int main () {std::vector<int> foo {1,2,3,4,5,6,7,8,9};std::vector<int> odd, even;// resize vectors to proper size:unsigned n = std::count_if (foo.begin(), foo.end(), IsOdd);odd.resize(n); even.resize(foo.size()-n);// partition:std::partition_copy (foo.begin(), foo.end(), odd.begin(), even.begin(), IsOdd);// print contents:std::cout << "odd: ";  for (int& x:odd)  std::cout << ' ' << x; std::cout << '\n';std::cout << "even: "; for (int& x:even) std::cout << ' ' << x; std::cout << '\n';return 0;
}Output:
odd: 1 3 5 7 9
even: 2 4 6 8

partition_point

向分区范围[first,last)中pred不为true的第一个元素返回迭代器,指示其分区点。

范围中的元素应该已经被分区,就好像partition是用相同的参数调用的一样。

该函数通过比较排序范围中的非连续元素来优化执行的比较次数,这对于随机访问迭代器特别有效。

template <class ForwardIterator, class UnaryPredicate>ForwardIterator partition_point (ForwardIterator first, ForwardIterator last,UnaryPredicate pred)
{auto n = distance(first,last);while (n>0){ForwardIterator it = first;auto step = n/2;std::advance (it,step);if (pred(*it)) { first=++it; n-=step+1; }else n=step;}return first;
}
// partition_point example
#include <iostream>     // std::cout
#include <algorithm>    // std::partition, std::partition_point
#include <vector>       // std::vectorbool IsOdd (int i) { return (i%2)==1; }int main () {std::vector<int> foo {1,2,3,4,5,6,7,8,9};std::vector<int> odd;std::partition (foo.begin(),foo.end(),IsOdd);auto it = std::partition_point(foo.begin(),foo.end(),IsOdd);odd.assign (foo.begin(),it);// print contents of odd:std::cout << "odd:";for (int& x:odd) std::cout << ' ' << x;std::cout << '\n';return 0;
}Output:
odd: 1 3 5 7 9

Sorting

sort

default (1)
template <class RandomAccessIterator>  void sort (RandomAccessIterator first, RandomAccessIterator last);
custom (2)
template <class RandomAccessIterator, class Compare>  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

按升序对范围 [first,last)中的元素进行排序。 第一个版本使用运算符<比较元素,第二个版本使用comp比较元素。 等效元素不能保证保持其原始相对顺序(请参见stable_sort)。

// sort algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vectorbool myfunction (int i,int j) { return (i<j); }struct myclass {bool operator() (int i,int j) { return (i<j);}
} myobject;int main () {int myints[] = {32,71,12,45,26,80,53,33};std::vector<int> myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33// using default comparison (operator <):std::sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33// using function as compstd::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)// using object as compstd::sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)// print out content:std::cout << "myvector contains:";for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0;
}Output:
myvector contains: 12 26 32 33 45 53 71 80

stable_sort

template <class RandomAccessIterator>  void stable_sort ( RandomAccessIterator first, RandomAccessIterator last );template <class RandomAccessIterator, class Compare>  void stable_sort ( RandomAccessIterator first, RandomAccessIterator last,                     Compare comp );

对保持等价顺序的元素进行排序

将范围[first,last) 中的元素按升序排序,类似于排序,但stable_sort保留了具有等效值的元素的相对顺序。 第一个版本使用运算符<比较元素,第二个版本使用comp比较元素。

// stable_sort example
#include <iostream>     // std::cout
#include <algorithm>    // std::stable_sort
#include <vector>       // std::vectorbool compare_as_ints (double i,double j)
{return (int(i)<int(j));
}int main () {double mydoubles[] = {3.14, 1.41, 2.72, 4.67, 1.73, 1.32, 1.62, 2.58};std::vector<double> myvector;myvector.assign(mydoubles,mydoubles+8);std::cout << "using default comparison:";std::stable_sort (myvector.begin(), myvector.end());for (std::vector<double>::iterator it=myvector.begin(); it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';myvector.assign(mydoubles,mydoubles+8);std::cout << "using 'compare_as_ints' :";std::stable_sort (myvector.begin(), myvector.end(), compare_as_ints);for (std::vector<double>::iterator it=myvector.begin(); it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0;
}

compare_as_ints是一个只比较元素的积分部分的函数,因此,具有相同积分部分的元素被认为是等价的。stable_sort保留调用之前的相对顺序。

Possible output:

using default comparison: 1.32 1.41 1.62 1.73 2.58 2.72 3.14 4.67
using 'compare_as_ints' : 1.41 1.73 1.32 1.62 2.72 2.58 3.14 4.67

partial_sort

default (1)
template <class RandomAccessIterator>  void partial_sort (RandomAccessIterator first, RandomAccessIterator middle,                     RandomAccessIterator last);
custom (2)
template <class RandomAccessIterator, class Compare>  void partial_sort (RandomAccessIterator first, RandomAccessIterator middle,                     RandomAccessIterator last, Compare comp);

对范围中的元素进行部分排序

重新排列范围中的元素[first,last),使middle之前的元素是整个范围中最小的元素,并按升序排序,而其余元素则没有任何特定的顺序。 第一个版本使用运算符<比较元素,第二个版本使用comp比较元素。

// partial_sort example
#include <iostream>     // std::cout
#include <algorithm>    // std::partial_sort
#include <vector>       // std::vectorbool myfunction (int i,int j) { return (i<j); }int main () {int myints[] = {9,8,7,6,5,4,3,2,1};std::vector<int> myvector (myints, myints+9);// using default comparison (operator <):std::partial_sort (myvector.begin(), myvector.begin()+5, myvector.end());// using function as compstd::partial_sort (myvector.begin(), myvector.begin()+5, myvector.end(),myfunction);// print out content:std::cout << "myvector contains:";for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0;
}
Possible output:
myvector contains: 1 2 3 4 5 9 8 7 6

partial_sort_copy

default (1)
template <class InputIterator, class RandomAccessIterator>  RandomAccessIterator    partial_sort_copy (InputIterator first,InputIterator last,                       RandomAccessIterator result_first,                       RandomAccessIterator result_last);
custom (2)
template <class InputIterator, class RandomAccessIterator, class Compare>  RandomAccessIterator    partial_sort_copy (InputIterator first,InputIterator last,                       RandomAccessIterator result_first,                       RandomAccessIterator result_last, Compare comp);

复制并部分排序范围

将[first,last)到[result_first,result_last)范围内的最小元素复制,并对复制的元素进行排序。复制的元素数量与result_firs和result_last之间的距离相同(除非这大于[first、last)中的元素数量)。 范围[first,last)未修改。 第一个版本使用运算符<比较元素,第二个版本使用comp比较元素。

// partial_sort_copy example
#include <iostream>     // std::cout
#include <algorithm>    // std::partial_sort_copy
#include <vector>       // std::vectorbool myfunction (int i,int j) { return (i<j); }int main () {int myints[] = {9,8,7,6,5,4,3,2,1};std::vector<int> myvector (5);// using default comparison (operator <):std::partial_sort_copy (myints, myints+9, myvector.begin(), myvector.end());// using function as compstd::partial_sort_copy (myints, myints+9, myvector.begin(), myvector.end(), myfunction);// print out content:std::cout << "myvector contains:";for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0;
}Output:
myvector contains: 1 2 3 4 5

is_sorted

default (1)
template <class ForwardIterator>  bool is_sorted (ForwardIterator first, ForwardIterator last);
custom (2)
template <class ForwardIterator, class Compare>  bool is_sorted (ForwardIterator first, ForwardIterator last, Compare comp);

检查范围是否排序

如果范围[first,last)按升序排序,则返回true。

第一个版本使用运算符<比较元素,第二个版本使用comp比较元素。

template <class ForwardIterator>bool is_sorted (ForwardIterator first, ForwardIterator last)
{if (first==last) return true;ForwardIterator next = first;while (++next!=last) {if (*next<*first)     // or, if (comp(*next,*first)) for version (2)return false;++first;}return true;
}
// is_sorted example
#include <iostream>     // std::cout
#include <algorithm>    // std::is_sorted, std::prev_permutation
#include <array>        // std::arrayint main () {std::array<int,4> foo {2,4,1,3};do {// try a new permutation:std::prev_permutation(foo.begin(),foo.end());// print range:std::cout << "foo:";for (int& x:foo) std::cout << ' ' << x;std::cout << '\n';} while (!std::is_sorted(foo.begin(),foo.end()));std::cout << "the range is sorted!\n";return 0;
}Output:
foo: 2 3 4 1
foo: 2 3 1 4
foo: 2 1 4 3
foo: 2 1 3 4
foo: 1 4 3 2
foo: 1 4 2 3
foo: 1 3 4 2
foo: 1 3 2 4
foo: 1 2 4 3
foo: 1 2 3 4
the range is sorted!

is_sorted_until

default (1)
template <class ForwardIterator>  ForwardIterator is_sorted_until (ForwardIterator first, ForwardIterator last);
custom (2)
template <class ForwardIterator, class Compare>  ForwardIterator is_sorted_until (ForwardIterator first, ForwardIterator last,                                   Compare comp);

查找范围中第一个未排序的元素

将迭代器返回到范围[first,last)中不遵循升序的第一个元素。

对 first和返回的迭代器之间的范围进行排序。

如果对整个范围进行了排序,则函数返回last。

第一个版本使用运算符<比较元素,第二个版本使用comp比较元素。

template <class ForwardIterator>ForwardIterator is_sorted_until (ForwardIterator first, ForwardIterator last)
{if (first==last) return first;ForwardIterator next = first;while (++next!=last) {if (*next<*first) return next;++first;}return last;
}
// is_sorted_until example
#include <iostream>     // std::cout
#include <algorithm>    // std::is_sorted_until, std::prev_permutation
#include <array>        // std::arrayint main () {std::array<int,4> foo {2,4,1,3};std::array<int,4>::iterator it;do {// try a new permutation:std::prev_permutation(foo.begin(),foo.end());// print range:std::cout << "foo:";for (int& x:foo) std::cout << ' ' << x;it=std::is_sorted_until(foo.begin(),foo.end());std::cout << " (" << (it-foo.begin()) << " elements sorted)\n";} while (it!=foo.end());std::cout << "the range is sorted!\n";return 0;
}Output:
foo: 2 3 4 1 (3 elements sorted)
foo: 2 3 1 4 (2 elements sorted)
foo: 2 1 4 3 (1 elements sorted)
foo: 2 1 3 4 (1 elements sorted)
foo: 1 4 3 2 (2 elements sorted)
foo: 1 4 2 3 (2 elements sorted)
foo: 1 3 4 2 (3 elements sorted)
foo: 1 3 2 4 (2 elements sorted)
foo: 1 2 4 3 (3 elements sorted)
foo: 1 2 3 4 (4 elements sorted)
the range is sorted!

nth_element

default (1)
template <class RandomAccessIterator>  void nth_element (RandomAccessIterator first, RandomAccessIterator nth,                    RandomAccessIterator last);
custom (2)
template <class RandomAccessIterator, class Compare>  void nth_element (RandomAccessIterator first, RandomAccessIterator nth,                    RandomAccessIterator last, Compare comp);

对范围中的元素排序

重新排列范围[first,last)中的元素,使第n个位置的元素是排序序列中该位置的元素。 其他元素没有任何特定的顺序,除了第n个之前的元素没有一个大于它,后面的元素也没有一个小于它。 第一个版本使用运算符<比较元素,第二个版本使用comp比较元素。

// nth_element example
#include <iostream>     // std::cout
#include <algorithm>    // std::nth_element, std::random_shuffle
#include <vector>       // std::vectorbool myfunction (int i,int j) { return (i<j); }int main () {std::vector<int> myvector;// set some values:for (int i=1; i<10; i++) myvector.push_back(i);   // 1 2 3 4 5 6 7 8 9std::random_shuffle (myvector.begin(), myvector.end());// using default comparison (operator <):std::nth_element (myvector.begin(), myvector.begin()+5, myvector.end());// using function as compstd::nth_element (myvector.begin(), myvector.begin()+5, myvector.end(),myfunction);// print out content:std::cout << "myvector contains:";for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0;
}Possible output:
myvector contains: 3 1 4 2 5 6 9 7 8

Binary search (operating on partitioned/sorted ranges)

lower_bound

default (1)
template <class ForwardIterator, class T>  ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last,                               const T& val);
custom (2)
template <class ForwardIterator, class T, class Compare>  ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last,                               const T& val, Compare comp);

将迭代器返回到下界

返回一个迭代器,该迭代器指向范围[first,last)中的第一个元素,该元素的比较值不小于val。

第一个版本使用运算符<比较元素,第二个版本使用comp比较元素。该范围内的元素应已根据相同的标准(运算符<或comp)进行排序,或至少根据值进行分区。

该函数通过比较排序范围中的非连续元素来优化执行的比较次数,这对于随机访问迭代器特别有效。

与upper_bound不同,此函数返回的迭代器所指向的值也可能等效于val,而不仅仅是更大。

template <class ForwardIterator, class T>ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val)
{ForwardIterator it;iterator_traits<ForwardIterator>::difference_type count, step;count = distance(first,last);while (count>0){it = first; step=count/2; advance (it,step);if (*it<val) {                 // or: if (comp(*it,val)), for version (2)first=++it;count-=step+1;}else count=step;}return first;
}
// lower_bound/upper_bound example
#include <iostream>     // std::cout
#include <algorithm>    // std::lower_bound, std::upper_bound, std::sort
#include <vector>       // std::vectorint main () {int myints[] = {10,20,30,30,20,10,10,20};std::vector<int> v(myints,myints+8);           // 10 20 30 30 20 10 10 20std::sort (v.begin(), v.end());                // 10 10 10 20 20 20 30 30std::vector<int>::iterator low,up;low=std::lower_bound (v.begin(), v.end(), 20); //          ^up= std::upper_bound (v.begin(), v.end(), 20); //                   ^std::cout << "lower_bound at position " << (low- v.begin()) << '\n';std::cout << "upper_bound at position " << (up - v.begin()) << '\n';return 0;
}Output:
lower_bound at position 3
upper_bound at position 6

upper_bound

default (1)
template <class ForwardIterator, class T>  ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,                               const T& val);
custom (2)
template <class ForwardIterator, class T, class Compare>  ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,                               const T& val, Compare comp);

将迭代器返回到上限

返回一个迭代器,该迭代器指向范围[first,last)中比较大于val的第一个元素。

第一个版本使用运算符<比较元素,第二个版本使用comp比较元素。该范围内的元素应已根据相同的标准(运算符<或comp)进行排序,或至少根据值进行分区。

该函数通过比较排序范围中的非连续元素来优化执行的比较次数,这对于随机访问迭代器特别有效。

与lower_bound不同,此函数返回的迭代器所指向的值不能等于val,只能大于val。

template <class ForwardIterator, class T>ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& val)
{ForwardIterator it;iterator_traits<ForwardIterator>::difference_type count, step;count = std::distance(first,last);while (count>0){it = first; step=count/2; std::advance (it,step);if (!(val<*it))                 // or: if (!comp(val,*it)), for version (2){ first=++it; count-=step+1;  }else count=step;}return first;
}
// lower_bound/upper_bound example
#include <iostream>     // std::cout
#include <algorithm>    // std::lower_bound, std::upper_bound, std::sort
#include <vector>       // std::vectorint main () {int myints[] = {10,20,30,30,20,10,10,20};std::vector<int> v(myints,myints+8);           // 10 20 30 30 20 10 10 20std::sort (v.begin(), v.end());                // 10 10 10 20 20 20 30 30std::vector<int>::iterator low,up;low=std::lower_bound (v.begin(), v.end(), 20); //          ^up= std::upper_bound (v.begin(), v.end(), 20); //                   ^std::cout << "lower_bound at position " << (low- v.begin()) << '\n';std::cout << "upper_bound at position " << (up - v.begin()) << '\n';return 0;
}Output:
lower_bound at position 3
upper_bound at position 6

equal_range

default (1)
template <class ForwardIterator, class T>  pair<ForwardIterator,ForwardIterator>    equal_range (ForwardIterator first, ForwardIterator last, const T& val);
custom (2)
template <class ForwardIterator, class T, class Compare>  pair<ForwardIterator,ForwardIterator>    equal_range (ForwardIterator first, ForwardIterator last, const T& val,                  Compare comp);

获取相等元素的子范围

返回子范围的边界,该子范围包括值等于val的范围[first,last]的所有元素。

第一个版本使用运算符<比较元素,第二个版本使用comp比较元素。两个元素a和b被认为是等价的,如果(!(a<b)&&!(b<a))或如果(!comp(a,b)&&!comp(b,a))。

该范围内的元素应已根据相同的标准(运算符<或comp)进行排序,或至少根据值进行分区。

如果val不等于范围中的任何值,则返回的子范围的长度为零,两个迭代器都指向比val大的最近值(如果有),或者指向最后一个值(如果val比范围中的所有元素都大)。

template <class ForwardIterator, class T>pair<ForwardIterator,ForwardIterator>equal_range (ForwardIterator first, ForwardIterator last, const T& val)
{ForwardIterator it = std::lower_bound (first,last,val);return std::make_pair ( it, std::upper_bound(it,last,val) );
}
// equal_range example
// equal_range example
#include <iostream>     // std::cout
#include <algorithm>    // std::equal_range, std::sort
#include <vector>       // std::vectorbool mygreater (int i,int j) { return (i>j); }int main () {int myints[] = {10,20,30,30,20,10,10,20};std::vector<int> v(myints,myints+8);                         // 10 20 30 30 20 10 10 20std::pair<std::vector<int>::iterator,std::vector<int>::iterator> bounds;// using default comparison:std::sort (v.begin(), v.end());                              // 10 10 10 20 20 20 30 30bounds=std::equal_range (v.begin(), v.end(), 20);            //          ^        ^// using "mygreater" as comp:std::sort (v.begin(), v.end(), mygreater);                   // 30 30 20 20 20 10 10 10bounds=std::equal_range (v.begin(), v.end(), 20, mygreater); //       ^        ^std::cout << "bounds at positions " << (bounds.first - v.begin());std::cout << " and " << (bounds.second - v.begin()) << '\n';return 0;
}Output:
bounds at positions 2 and 5

binary_search

default (1)
template <class ForwardIterator, class T>  bool binary_search (ForwardIterator first, ForwardIterator last,                      const T& val);
custom (2)
template <class ForwardIterator, class T, class Compare>  bool binary_search (ForwardIterator first, ForwardIterator last,                      const T& val, Compare comp);

测试排序序列中是否存在值

如果范围[first,last)中的任何元素等于val,则返回true,否则返回false。

第一个版本使用运算符<比较元素,第二个版本使用comp比较元素。两个元素a和b被认为是等价的,如果(!(a<b)&&!(b<a))或如果(!comp(a,b)&&!comp(b,a))。

该范围内的元素应已根据相同的标准(运算符<或comp)进行排序,或至少根据值进行分区。

该函数通过比较排序范围中的非连续元素来优化执行的比较次数,这对于随机访问迭代器特别有效。

template <class ForwardIterator, class T>bool binary_search (ForwardIterator first, ForwardIterator last, const T& val)
{first = std::lower_bound(first,last,val);return (first!=last && !(val<*first));
}
// binary_search example
#include <iostream>     // std::cout
#include <algorithm>    // std::binary_search, std::sort
#include <vector>       // std::vectorbool myfunction (int i,int j) { return (i<j); }int main () {int myints[] = {1,2,3,4,5,4,3,2,1};std::vector<int> v(myints,myints+9);                         // 1 2 3 4 5 4 3 2 1// using default comparison:std::sort (v.begin(), v.end());std::cout << "looking for a 3... ";if (std::binary_search (v.begin(), v.end(), 3))std::cout << "found!\n"; else std::cout << "not found.\n";// using myfunction as comp:std::sort (v.begin(), v.end(), myfunction);std::cout << "looking for a 6... ";if (std::binary_search (v.begin(), v.end(), 6, myfunction))std::cout << "found!\n"; else std::cout << "not found.\n";return 0;
}Output:
looking for a 3... found!
looking for a 6... not found.

http://www.ppmy.cn/news/101880.html

相关文章

【网络技术】防火墙配置单机旁挂模式

组网需求 某公司网络部署Agile Controller服务器组&#xff0c;同时以旁挂方式部署FW于网络出口&#xff0c;如图1所示&#xff0c;要求&#xff1a; •用户角色不同&#xff0c;能访问的网络资源也不同&#xff08;在Agile Controller服务器中配置&#xff09;。 •用户角色…

JSTL(一)-- JSTL的快速入门

目录 1. JSTL的概述: 2. JSTL的使用前提: 3. JSTLL核心标签库(最常用到的3个标签) 3.1 if语句

如何优雅的在SpringBoot中编写选择分支,而不是大量if else?

一、需求背景二、创建项目三、基础工作四、定义 Handler 类五、实现员工接口六、功能测试6.1 开发控制器6.2 功能测试 七、总结 一、需求背景 部门通常指的是在一个组织或企业中组成的若干人员&#xff0c;他们共同从事某一特定工作&#xff0c;完成共同的任务和目标。在组织或…

实时频谱-4.1实时频谱分析仪的应用

脉冲测量 泰克实时频谱分析仪(RSA)特别适合进行脉冲测量。所有 RSA 型号上都可以包括自动脉冲测量软件。可以选择对各个脉冲和脉冲趋势信息进行全面分析。与传统频谱分析仪不同&#xff0c;各种型号的 RSA 都指定了系统上升时间 / 下降时间(最高 10 ns)、最小脉冲周期(最短 50…

EL表达式(二)-- EL表达式的基本用法

目录 1. EL表达式的运算 1.1 算术运算符 1.2 逻辑运算符 1.3 比较运算符

淘宝直通车和引力魔方区别

自从平台推出了引力魔方之后&#xff0c;就有很多卖家分不清&#xff0c;自己的店铺到底是适合直通车呢&#xff1f;还是适合引力魔方去推广呢&#xff1f; 其实很简单&#xff0c;因为这两个工具的功能完全不一样。直通车带来的是搜索流量&#xff0c;通过搜索竞价的方式点击成…

【滤波】设计卡尔曼滤波器

本文主要翻译自rlabbe/Kalman-and-Bayesian-Filters-in-Python的第8章节08-Designing-Kalman-Filters&#xff08;设计卡尔曼滤波器&#xff09;。 %matplotlib inline#format the book import book_format book_format.set_style()简介 在上一章节中&#xff0c;我们讨论了教…

2023年高性能计算就业前景如何?IT人的机遇与挑战

在当今数字化时代&#xff0c;高性能计算&#xff08;HPC&#xff09;作为一项关键技术&#xff0c;正迅速成为各行各业的核心需求。不论是在职程序员还是在校大学生&#xff0c;懂高性能计算都将大大提升工作及科研、做课题的效率。而且加之2023年大模型的风靡&#xff0c;人工…