STL中常用的算法的使用(六):已排序区间算法

已排序区间算法,指其所作用的区间在某种顺序准则下已排序。

//对于每个测试函数, 导入以下头文件
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

binary_search():判断某区间内是否包含某个元素

int main()
{
	vector<int> a{ 1, 2, 3,4, 10 ,5,6,6,9 };
	cout << binary_search(a.begin()+3,a.end(),5);  //需要排序,否则找到10,比5大,就不往下找了
	cout << endl;
	vector<int> b{ 1, 2, 3,4 ,5,6,6,9 };
	cout << binary_search(b.begin() + 3, b.end(), 5);
}

在这里插入图片描述

includes():判断某区间的每个元素是否都涵盖在另一个区间内

int main()
{
	vector<int> a{ 1, 2, 3,4 ,5,6,6,9 }, b{ 1, 2, 3,4 }, c{0,1,2,3,4};
	cout << includes(a.begin(), a.end(), b.begin(), b.end());
	cout << endl;
	cout << includes(a.begin(), a.end(), c.begin(), c.end());
}

在这里插入图片描述

lower_bound():查找第一个大于等于某个给定值的元素的位置

int main()
{
	vector<int> a{ 1, 2, 3,4 ,5,6,6,7,9 };
	cout << *lower_bound(a.begin(), a.end(),7);
}

在这里插入图片描述

upper_bound():查找第一个大于某个给定值的元素的位置

int main()
{
	vector<int> a{ 1, 2, 3,4 ,5,6,6,7,9 };
	cout << *upper_bound(a.begin(), a.end(),7);
}

在这里插入图片描述

equal_range():返回等于某指定值的所有元素构成的区间(首尾迭代器组成的pair对象)

int main()
{
	vector<int> a{ 1, 2, 3,4 ,5,6,6,7,9 };
	cout << distance(a.begin(),equal_range(a.begin(), a.end(),6).first)<<endl;   //左闭右开
	cout << distance(a.begin(), equal_range(a.begin(), a.end(), 6).second);
}

在这里插入图片描述

merge():合并两个区间的元素到目标容器

int main()
{
	vector<int> a{ 1, 2, 3,4 ,5,6,6,7,9 }, b = {0,1,2,3},c;
	merge(a.begin(), a.end(), b.begin(), b.end(), back_inserter(c));  //目标容器c
	for_each(c.begin(), c.end(), [](int i) {cout << i << ' '; });

}

在这里插入图片描述

set_union():求两个区间的并集,放入目标容器

int main()
{
	vector<int> a{ 1, 2, 3,4 ,5,6,6,7,9 }, b = {0,1,2,3},c;
	set_union(a.begin(), a.end(), b.begin(), b.end(), back_inserter(c));
	for_each(c.begin(), c.end(), [](int i) {cout << i << ' '; });
}

在这里插入图片描述

set_intersection():求两个区间的交集,放入目标容器

int main()
{
	vector<int> a{ 1, 2, 3,4 ,5,6,6,7,9 }, b = {0,1,2,3},c;
	set_intersection(a.begin(), a.end(), b.begin(), b.end(), back_inserter(c));
	for_each(c.begin(), c.end(), [](int i) {cout << i << ' '; });
}

在这里插入图片描述

set_difference():求位于第一区间但不位于第二区间的所有元素,形成一个已排序区间

int main()
{
	vector<int> a{ 1, 2, 3,4 ,5,6,6,7,9 }, b = {0,1,2,3,6},c;
	set_difference(a.begin(), a.end(), b.begin(), b.end(), back_inserter(c));
	for_each(c.begin(), c.end(), [](int i) {cout << i << ' '; });
}

在这里插入图片描述

set_symmetric_difference():找出只出现在两区间之一的所有元素,形成一个已排序的区间

int main()
{
	vector<int> a{ 1, 2, 3,4 ,5,6,6,7,9 }, b = {0,1,2,3,6},c;
	set_symmetric_difference(a.begin(), a.end(), b.begin(), b.end(), back_inserter(c));
	for_each(c.begin(), c.end(), [](int i) {cout << i << ' '; });
}

在这里插入图片描述

inplace_merge():将两个连贯的已排序区间合并

如果2个有序序列存储在同一个容器中,可以用inplace_merge进行合并,并替换原有的容器;

int main()
{
	vector<int> a{ 1, 2, 3,4 ,0,1,2,3,4 },c;
	inplace_merge(a.begin(), a.begin()+4, a.end());  //+4为两个已排序的中间点 默认升序
	for_each(a.begin(), a.end(), [](int i) {cout << i << ' '; });
}

在这里插入图片描述

int main()
{
	vector<int> a{4,3,2,1,5,3,2,1 },c;
	inplace_merge(a.begin(), a.begin()+4, a.end(),greater<int>()); //指定升序
	for_each(a.begin(), a.end(), [](int i) {cout << i << ' '; });
}

在这里插入图片描述

partition_point():用一个判断式分割区间,返回分割元素的位置

int main()
{
	vector<int> a{1,2,3,4,4,5,6,8,9},c;
	cout<< *partition_point(a.begin(), a.end(), [](int a) {return a < 7; }); //分割点值为8
}

在这里插入图片描述

int main()
{
	vector<int> a{1,2,3,4,4,5,6,8,9},c;
	cout<< (partition_point(a.begin(), a.end(), [](int a) {return a < 10; })== a.end()); //找不到分割点
}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++11STL常用排序算法有以下几种: 1. sort sort是STL常用排序算法,它可以对容器的元素进行排序。sort的时间复杂度为O(NlogN),使用快速排序算法实现。sort的基本使用方法如下: ```c++ sort(begin, end); // 对区间[begin, end)内的元素排序 ``` 其,`begin`和`end`分别是容器排序的元素的起始和结束迭代器。 此外,sort还可以接受一个可调用对象作为参数,来实现自定义的排序方法。例如,可以按照元素的某个属性进行排序: ```c++ sort(v.begin(), v.end(), [](const auto& a, const auto& b) { return a.property < b.property; }); // 按照元素的property属性进行排序 ``` 2. stable_sort stable_sort与sort的用法类似,也可以对容器的元素进行排序,但它保证了相等元素的相对顺序不会发生改变。stable_sort的时间复杂度为O(NlogN),使用归并排序算法实现。stable_sort的基本使用方法如下: ```c++ stable_sort(begin, end); // 对区间[begin, end)内的元素排序 ``` 3. partial_sort partial_sort可以对容器的元素进行部分排序,即只将前k个最小(或最大)的元素放在容器的前k个位置上。partial_sort的时间复杂度为O(Nlogk),使用排序算法实现。partial_sort的基本使用方法如下: ```c++ partial_sort(begin, middle, end); // 将区间[begin, end)内的前middle-begin个元素排序,其他元素保持原有顺序 ``` 其,`middle`是一个迭代器,指向容器排序后前middle-begin个元素的末尾位置。 4. nth_element nth_element可以找出容器第k小(或第k大)的元素。nth_element的时间复杂度为O(N),使用快速选择算法实现。nth_element的基本使用方法如下: ```c++ nth_element(begin, nth, end); // 将区间[begin, end)内的元素排序,使得第nth个元素是第nth小的元素 ``` 其,`nth`是一个迭代器,指向容器第nth小的元素。 以上就是C++11STL常用排序算法,可以根据实际需求选择适合的算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值