泛型算法,排序的相关操作,lower_bound、upper_bound、equal_range
body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}
|
template< class ForwardIt, class T >
ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value ); 返回第一个不小于(>=)指定的数的迭代器。如果没找到就返回last 这个版本内部比较默认使用<
|
template< class ForwardIt, class T, class Compare >
ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value, Compare comp );
这个版本内部比较默认使用comp函数
|
|
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void print(vector<int>& ve)
{
for(auto elem:ve)
cout<<elem<<" ";
cout<<endl;
}
int main()
{
//容器有序
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> ve1(arr,arr+10);
print(ve1);
auto it = lower_bound(ve1.begin(),ve1.end(),2);
cout<<*it<<endl;
auto it2 = lower_bound(ve1.begin(),ve1.end(),11);
if(it2==ve1.end())
{
cout<<"not found!"<<endl;
}
//容器无序
int arr2[10] = {2,1,4,3,6,8,5,7,9,10};
vector<int> ve2(arr2,arr2+10);
print(ve2);
auto it3 = lower_bound(ve2.begin(),ve2.end(),5);
cout<<*it3<<endl;
}
//1 2 3 4 5 6 7 8 9 10
//2
//not found!
//2 1 4 3 6 8 5 7 9 10
//6
|
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void print(vector<int>& ve)
{
for(auto elem:ve)
cout<<elem<<" ";
cout<<endl;
}
bool comp(const int& a,const int& b)
{
return a<b; //从小到大
}
int main()
{
//容器有序
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> ve1(arr,arr+10);
print(ve1);
auto it = lower_bound(ve1.begin(),ve1.end(),2,comp);
cout<<*it<<endl;
print(ve1);
auto it2 = lower_bound(ve1.begin(),ve1.end(),11,comp);
print(ve1);
if(it2==ve1.end())
{
cout<<"not found!"<<endl;
}
//容器无序
int arr2[10] = {2,1,4,3,6,8,5,7,9,10};
vector<int> ve2(arr2,arr2+10);
print(ve2);
auto it3 = lower_bound(ve2.begin(),ve2.end(),5,comp);
print(ve2);
cout<<*it3<<endl;
}
//1 2 3 4 5 6 7 8 9 10
//2
//1 2 3 4 5 6 7 8 9 10
//1 2 3 4 5 6 7 8 9 10
//not found!
//2 1 4 3 6 8 5 7 9 10
//2 1 4 3 6 8 5 7 9 10
//6
|
|
template< class ForwardIt, class T >
ForwardIt upper_bound( ForwardIt first, ForwardIt last, const T& value );
返回第一个大于(>)指定的数的迭代器指针。内部元素之间比较规则采用<
|
template< class ForwardIt, class T, class Compare >
ForwardIt upper_bound( ForwardIt first, ForwardIt last, const T& value, Compare comp );
内部元素之间比较规则采用comp
|
|
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void print(vector<int>& ve)
{
for(auto elem:ve)
cout<<elem<<" ";
cout<<endl;
}
int main()
{
//容器有序
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> ve1(arr,arr+10);
print(ve1);
auto it = upper_bound(ve1.begin(),ve1.end(),2);
cout<<*it<<endl;
auto it2 = lower_bound(ve1.begin(),ve1.end(),11);
if(it2==ve1.end())
{
cout<<"not found!"<<endl;
}
//容器无序
int arr2[10] = {2,1,4,3,6,8,5,7,9,10};
vector<int> ve2(arr2,arr2+10);
print(ve2);
auto it3 = lower_bound(ve2.begin(),ve2.end(),3);
cout<<*it3<<endl;
}
//1 2 3 4 5 6 7 8 9 10
//3
//not found!
//2 1 4 3 6 8 5 7 9 10
//4
|
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void print(vector<int>& ve)
{
for(auto elem:ve)
cout<<elem<<" ";
cout<<endl;
}
bool comp(const int& a,const int& b)
{
return a<b; //从小到大
}
int main()
{
//容器有序
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> ve1(arr,arr+10);
print(ve1);
auto it = upper_bound(ve1.begin(),ve1.end(),2,comp);
cout<<*it<<endl;
print(ve1);
auto it2 = upper_bound(ve1.begin(),ve1.end(),11,comp);
print(ve1);
if(it2==ve1.end())
{
cout<<"not found!"<<endl;
}
//容器无序
int arr2[10] = {2,1,4,3,6,8,5,7,9,10};
vector<int> ve2(arr2,arr2+10);
print(ve2);
auto it3 = upper_bound(ve2.begin(),ve2.end(),5,comp);
print(ve2);
cout<<*it3<<endl;
}
//1 2 3 4 5 6 7 8 9 10
//3
//1 2 3 4 5 6 7 8 9 10
//1 2 3 4 5 6 7 8 9 10
//not found!
//2 1 4 3 6 8 5 7 9 10
//2 1 4 3 6 8 5 7 9 10
//6
|
|
template< class ForwardIt, class T >
std::pair<ForwardIt,ForwardIt>
equal_range( ForwardIt first, ForwardIt last,
const T& value );
返回的是两个迭代器指针,第一个迭代器指针相当于lower_bound返回的,第二个相当于upper_bound返回的,内部比较规则,默认<
如果没有不小于指定元素的数,就返回ForwardIt first,同理,后面一个没有满足要求的元素就返回ForwardIt last
|
template< class ForwardIt, class T, class Compare >
std::pair<ForwardIt,ForwardIt>
equal_range( ForwardIt first, ForwardIt last,
const T& value, Compare comp );
内部比较规则,comp
|
|
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void print(vector<int>& ve)
{
for(auto elem:ve)
cout<<elem<<" ";
cout<<endl;
}
int main()
{
//容器有序
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> ve1(arr,arr+10);
print(ve1);
auto pair = equal_range(ve1.begin(),ve1.end(),5); //返回一个pair<vector<int>::iterator,vector<int>::iterator>,第一个指向第一个不小于5的元素,第二个指向第一个大于5的元素
for(auto it = pair.first;it<=pair.second;++it)
cout<<*it<<" ";
cout<<endl;
auto pair2 = equal_range(ve1.begin(),ve1.end(),11);
if(pair2.first==ve1.end() && pair2.second==ve1.end())
cout<<"not found"<<endl;
//容器无序
int arr2[10] = {2,1,4,3,6,8,5,7,9,10};
vector<int> ve2(arr2,arr2+10);
print(ve2);
auto pair3 = equal_range(ve2.begin(),ve2.end(),5);
for(auto it = pair3.first;it<=pair3.second;++it)
cout<<*it<<" ";
cout<<endl;
}
//1 2 3 4 5 6 7 8 9 10
//5 6
//not found
//2 1 4 3 6 8 5 7 9 10
//6
|
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void print(vector<int>& ve)
{
for(auto elem:ve)
cout<<elem<<" ";
cout<<endl;
}
bool comp(const int&a ,const int&b)
{
return a<b;
}
int main()
{
//容器有序
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> ve1(arr,arr+10);
print(ve1);
auto pair = equal_range(ve1.begin(),ve1.end(),5,comp); //返回一个pair<vector<int>::iterator,vector<int>::iterator>,第一个指向第一个不小于5的元素,第二个指向第一个大于5的元素
for(auto it = pair.first;it<=pair.second;++it)
cout<<*it<<" ";
cout<<endl;
auto pair2 = equal_range(ve1.begin(),ve1.end(),11,comp);
if(pair2.first==ve1.end() && pair2.second==ve1.end())
cout<<"not found"<<endl;
//容器无序
int arr2[10] = {2,1,4,3,6,8,5,7,9,10};
vector<int> ve2(arr2,arr2+10);
print(ve2);
auto pair3 = equal_range(ve2.begin(),ve2.end(),5,comp);
for(auto it = pair3.first;it<=pair3.second;++it)
cout<<*it<<" ";
cout<<endl;
}
//1 2 3 4 5 6 7 8 9 10
//5 6
//not found
//2 1 4 3 6 8 5 7 9 10
//6
|
|
std::pair<iterator,iterator> equal_range( const Key& key );
std::pair<const_iterator,const_iterator> equal_range( const Key& key ) const;
Returns a range containing all elements with key key in the container. The range is defined by two iterators, the first pointing to the first element of the wanted range and the second pointing past the last element of the range.
//1 a
//1 b
//1 d
//请按任意键继续. . .
|
#include<iostream>
#include<unordered_map>
using namespace std;
int main()
{
pair<int,char> arr[4] = {
pair<int,char>(1,'a'),
pair<int,char>(1,'b'),
pair<int,char>(1,'d'),
pair<int,char>(2,'b')
};
unordered_multimap<int,char> ump(arr,arr+4);
pair<unordered_multimap<int,char>::iterator,unordered_multimap<int,char>::iterator> it = ump.equal_range(1);
for(unordered_multimap<int,char>::iterator iit = it.first;iit!=it.second;++iit)
{
cout<<iit->first<<" "<<iit->second<<endl;
}
system("pause");
}
|
泛型算法,排序的相关操作,lower_bound、upper_bound、equal_range的更多相关文章
- 二分查找法(binary_search,lower_bound,upper_bound,equal_range)
binary_search(二分查找) //版本一:调用operator<进行比较 template <class ForwardIterator,class StrictWeaklyCo ...
- C++ Primer : 第十章 : 泛型算法 之 只读、写和排序算法
大多数算法都定义在<algorithm>头文件里,而标准库还在头文件<numeric>里定义了一组数值泛型算法,比如accumulate. ● find算法,算法接受一对迭代 ...
- php对二维数组进行相关操作(排序、转换、去空白等)
php对二维数组进行相关操作(排序.转换.去空白等) 投稿:lijiao 字体:[增加 减小] 类型:转载 时间:2015-11-04 这篇文章主要介绍了php对二维数组进行相关操作,包括php对 ...
- C++的那些事:容器和泛型算法
一.顺序容器 1,标准库定义了3种类型的顺序容器:vector.list和deque.它们的差别主要在于访问元素的方式,以及添加或删除元素相关操作运算代价.标准库还提供了三种容器适配器:stack.q ...
- STL容器及泛型算法
一.顺序容器 1.容器的选择 (1) 随机访问,选vector ,deque (2) 在中间插入或者删除元素,选list (3) 在头尾插入或删除元素 , 选deque 2.list的成员函数 (1) ...
- STL的一些泛型算法
源地址:http://blog.csdn.net/byijie/article/details/8142859 从福州大学资料里摘下来的我现在能理解的泛型算法 algorithm min(a,b) 返 ...
- c++中常用的泛型算法
std中定义了很好几种顺序容器,它们自身也提供了一些操作,但是还有很多算法,容器本身没有提供. 而在algorithm头文件中,提供了许多算法,适用了大多数顺序容器.与c++11相比,很多函数在 c+ ...
- C++基础之泛型算法
标准库并未给每个容器添加大量功能,因此,通过大量泛型算法,来弥补.这些算法大多数独立于任何特定的容器,且是通用的,可用于不同类型的容器和不同的元素. 迭代器使得算法不依赖容器,但是算法依赖于元素的类型 ...
- C++ 泛型算法
<C++ Primer 4th>读书笔记 标准容器(the standard container)定义了很少的操作.标准库并没有为每种容器类型都定义实现这些操作的成员函数,而是定义了一组泛 ...
随机推荐
- Python全栈开发-Day12-Mysql数据库和ORM
本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 外键 增删改查表 权限 事务 索引 python 操作mysql ORM sql ...
- 两排序数组的中位数 Median of Two Sorted Arrays
2018-11-18 23:33:28 问题描述: 问题求解: 这个问题是一个比较有难度的可以使用二分搜索法求解的问题,如果采用朴素的解法进行merge再找中位数的话,其时间复杂度为O(n1 + n2 ...
- 子数组最小值的总和 Sum of Subarray Minimums
2018-09-27 23:33:49 问题描述: 问题求解: 方法一.DP(MLE) 动态规划的想法应该是比较容易想到的解法了,因为非常的直观,但是本题的数据规模还是比较大的,如果直接使用动态规划, ...
- sql 聚合函数和group by 联合使用
原文 很多时候单独使用聚合函数的时候觉得很容易,求个平均值,求和,求个数等,但是和分组一起用就有点混淆了,好记性不如烂笔头,所以就记下来以后看看. 常用聚合函数罗列 1 AVG() - 返回平均值 C ...
- eQTL | Expression quantitative trait loci | 数量性状位点 | 表达数量性状基因座
一篇通俗的文章:eQTL Expression quantitative trait loci (eQTLs) are genomic loci that explain all or a fract ...
- Mac 上搭建基于 Hexo + GitHub 个人博客
环境配置 本人电脑系统:macOS Node.js 生成静态页面.安装Node.js Git 用于将本地 Hexo 内容提交到 Github.Xcode自带Git(前提:macOS已经安装了Xcode ...
- jqprint的网页打印,打印预览可以包含图片
自己负责的模块需要有个试卷打印的功能,需要将网页特定范围内的内容打印出来,所以选择了jquery.jqprint脚本 用起来也非常简单. //打印 $("#printPage" ...
- python-flask-请求源码流程
启动先执行manage.py 中的 app.run() class Flask(_PackageBoundObject): def run(self, host=None, port=None, ...
- BCS SET EMAIL
FUNCTION zcrm_send_email. *"------------------------------------------------------------------- ...
- 根据科目计算父科目ID,并递归累计求父科目的金额
通常情况下,我们会从外部系统或者其他数据源得到以下树形结构的数据,并需要对其进行处理 其中,需要做的处理包括 1.计算每个科目的父科目ID,即PARENT_ID; 2.计算每个科目的ITEM_LEVE ...