C++11标准模板(STL)- 算法(std::nth_element)
创始人
2024-04-15 21:43:22
定义于头文件 

算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first, last) ,其中 last 指代要查询或修改的最后元素的后一个元素。

若一个集合是另一个的子集则返回 true

std::includes
template< class InputIt1, class InputIt2 >

bool includes( InputIt1 first1, InputIt1 last1,

               InputIt2 first2, InputIt2 last2 );
(1)(C++20 前)
template< class InputIt1, class InputIt2 >

constexpr bool includes( InputIt1 first1, InputIt1 last1,

                         InputIt2 first2, InputIt2 last2 );
(C++20 起)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >

bool includes( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1,

               ForwardIt2 first2, ForwardIt2 last2 );
(2)(C++17 起)
template< class InputIt1, class InputIt2, class Compare >

bool includes( InputIt1 first1, InputIt1 last1,

               InputIt2 first2, InputIt2 last2, Compare comp );
(3)(C++20 前)
template< class InputIt1, class InputIt2, class Compare >

constexpr bool includes( InputIt1 first1, InputIt1 last1,

                         InputIt2 first2, InputIt2 last2, Compare comp );
(C++20 起)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class Compare >

bool includes( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1,

               ForwardIt2 first2, ForwardIt2 last2, Compare comp );
(4)(C++17 起)

若已排序范围 [first2, last2) 是已排序范围 [first1, last1) 的子序列则返回 true 。(子序列不必相接。)

1) 两个范围都必须以 operator< 排序。

3) 两个范围都必须以给定的比较函数 comp 排序。

2,4) 同 (1,3) ,但按照 policy 执行。这些重载仅若 std::is_execution_policy_v> 为 true 才参与重载决议。

参数

first1, last1-要检验的已排序元素范围
first2, last2-要搜索的已排序元素范围
policy-所用的执行策略。细节见执行策略。
comp-比较函数对象(即满足比较 (Compare) 概念的对象),若第一参数小于(即序于)第二参数则返回 ​true 。

比较函数的签名应等价于如下:

 bool cmp(const Type1 &a, const Type2 &b);

虽然签名不必有 const & ,函数也不能修改传递给它的对象,而且必须接受(可为 const 的)类型 Type1Type2 的值,无关乎值类别(从而不允许 Type1 & ,亦不允许 Type1 ,除非 Type1 的移动等价于复制 (C++11 起))。
类型 Type1 与 Type2 必须使得 InputIt 类型的对象能在解引用后隐式转换到这两个类型。 ​

类型要求
- InputIt1, InputIt2 必须满足遗留输入迭代器 (LegacyInputIterator) 的要求。
- ForwardIt1, ForwardIt2 必须满足遗留向前迭代器 (LegacyForwardIterator) 的要求。

返回值

[first2, last2)[first1, last1) 的子序列则为 true ;否则为 false 。

复杂度

至多 2·(N1+N2-1) 次比较,其中 N1 = std::distance(first1, last1) 而 N2 = std::distance(first2, last2) 。

异常

拥有名为 ExecutionPolicy 的模板形参的重载按下列方式报告错误:

  • 若作为算法一部分调用的函数的执行抛出异常,且 ExecutionPolicy 为标准策略之一,则调用 std::terminate 。对于任何其他 ExecutionPolicy ,行为是实现定义的。
  • 若算法无法分配内存,则抛出 std::bad_alloc 。

 

可能的实现

版本一

template
bool includes(InputIt1 first1, InputIt1 last1,InputIt2 first2, InputIt2 last2)
{for (; first2 != last2; ++first1){if (first1 == last1 || *first2 < *first1)return false;if ( !(*first1 < *first2) )++first2;}return true;
}

版本二

template
bool includes(InputIt1 first1, InputIt1 last1,InputIt2 first2, InputIt2 last2, Compare comp)
{for (; first2 != last2; ++first1){if (first1 == last1 || comp(*first2, *first1))return false;if (!comp(*first1, *first2))++first2;}return true;
}

调用示例

#include 
#include 
#include 
#include 
#include 
#include using namespace std;struct Cell
{int x;int y;Cell &operator +=(const Cell &cell){x += cell.x;y += cell.y;return *this;}bool operator <(const Cell &cell) const{if (x == cell.x){return y < cell.y;}else{return x < cell.x;}}
};std::ostream &operator<<(std::ostream &os, const Cell &cell)
{os << "{" << cell.x << "," << cell.y << "}";return os;
}int main()
{srand((unsigned)time(NULL));;std::cout.setf(std::ios_base::boolalpha);auto func1 = [](){int n = std::rand() % 10 + 100;Cell cell{n, n};return cell;};// 初始化cells1vector cells1(8);std::generate(cells1.begin(), cells1.end(), func1);// 使用cells1初始化cells3vector cells3(5);std::copy(cells1.begin(), cells1.begin() + cells3.size(), cells3.begin());// 排序cells1std::stable_sort(cells1.begin(), cells1.end());// 打印cells1std::cout << "cells 1 :     ";std::copy(cells1.begin(), cells1.end(), std::ostream_iterator(std::cout, " "));std::cout << std::endl;// 初始化cells2vector cells2(5);std::generate(cells2.begin(), cells2.end(), func1);// 排序cells2std::stable_sort(cells2.begin(), cells2.end());// 打印cells2std::cout << "cells 2 :     ";std::copy(cells2.begin(), cells2.end(), std::ostream_iterator(std::cout, " "));std::cout << std::endl;bool bResult = std::includes(cells1.begin(), cells1.end(), cells2.begin(), cells2.end());std::cout << "cells1 include cells2: " << bResult ;std::cout << std::endl;// 排序cells3std::stable_sort(cells3.begin(), cells3.end());// 打印cells3std::cout << "cells 3 :     ";std::copy(cells3.begin(), cells3.end(), std::ostream_iterator(std::cout, " "));std::cout << std::endl;bResult = std::includes(cells1.begin(), cells1.end(), cells3.begin(), cells3.end());std::cout << "cells1 include cells3: " << bResult ;std::cout << std::endl;std::cout << std::endl;auto is_sortf = [](const Cell & a, const Cell & b){if (a.x == b.x){return a.y > b.y;}return a.x > b.x;};// 初始化cells4vector cells4(8);std::generate(cells4.begin(), cells4.end(), func1);// 使用cells4初始化cells6vector cells6(5);std::copy(cells4.begin(), cells4.begin() + cells6.size(), cells6.begin());// 排序cells4std::stable_sort(cells4.begin(), cells4.end(), is_sortf);// 打印cells4std::cout << "cells 4 :     ";std::copy(cells4.begin(), cells4.end(), std::ostream_iterator(std::cout, " "));std::cout << std::endl;// 初始化cells5vector cells5(5);std::generate(cells5.begin(), cells5.end(), func1);// 排序cells5std::stable_sort(cells5.begin(), cells5.end(), is_sortf);// 打印cells5std::cout << "cells 5 :     ";std::copy(cells5.begin(), cells5.end(), std::ostream_iterator(std::cout, " "));std::cout << std::endl;bResult = std::includes(cells4.begin(), cells4.end(), cells5.begin(), cells5.end(), is_sortf);std::cout << "cells4 include cells4: " << bResult ;std::cout << std::endl;// 排序cells3std::stable_sort(cells6.begin(), cells6.end(), is_sortf);// 打印cells6std::cout << "cells 6 :     ";std::copy(cells6.begin(), cells6.end(), std::ostream_iterator(std::cout, " "));std::cout << std::endl;bResult = std::includes(cells4.begin(), cells4.end(), cells6.begin(), cells6.end(), is_sortf);std::cout << "cells4 include cells6: " << bResult ;std::cout << std::endl;std::cout << std::endl;return 0;
}

输出

 

相关内容

热门资讯

demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...