已排序区间算法
- binary_search():判断某区间内是否包含某个元素
- includes():判断某区间的每个元素是否都涵盖在另一个区间内
- lower_bound():查找第一个大于等于某个给定值的元素的位置
- upper_bound():查找第一个大于某个给定值的元素的位置
- equal_range():返回等于某指定值的所有元素构成的区间(首尾迭代器组成的pair对象)
- merge():合并两个区间的元素到目标容器
- set_union():求两个区间的并集,放入目标容器
- set_intersection():求两个区间的交集,放入目标容器
- set_difference():求位于第一区间但不位于第二区间的所有元素,形成一个已排序区间
- set_symmetric_difference():找出只出现在两区间之一的所有元素,形成一个已排序的区间
- inplace_merge():将两个连贯的已排序区间合并
- partition_point():用一个判断式分割区间,返回分割元素的位置
已排序区间算法,指其所作用的区间在某种顺序准则下已排序。
//对于每个测试函数, 导入以下头文件
#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()); //找不到分割点
}