c++之STL(13) STL 算法 - 查找算法(7)lower_bound() upper_bound() equal_range(0
2016-08-14 23:55
585 查看
以下三个算法对所有容器都是可以使用的(一定要先排序)
lower_bound() // 查找第一个可能的位置
upper_bound() // 查找最后一个可能的位置
equal_range() // 同时可以查找上面的两个
但是 关联式容器(主要是multiset,multimap)有等效的成员函数,性能更佳
STL 算法-查找算法
find()
find_if()
search_n()
search()
find_end()
find_first_of()
adjacent_find()
已序空间查找算法
binary_search()
includes()
lower_bound()
upper_bound()
#include<iostream>
#include<algorithm>
#include<list>
using namespace std;
int main()
{
list<int> ilist;
for (int i = 1; i <= 9; i++)
ilist.insert(ilist.end(), i);
for (int i = 1; i <= 9; i++)
ilist.insert(ilist.end(), i);
ilist.push_back(5);
ilist.push_back(5);
ilist.push_back(5);
ilist.sort();
for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
list<int>::iterator pos1, pos2;
pos1 = lower_bound(ilist.begin(), ilist.end(), 5);
cout << "第一个5的位置:" << distance(ilist.begin(), pos1) + 1 << endl;
pos2 = upper_bound(ilist.begin(), ilist.end(), 5); // >5的最后一个5的位置下一个位置
cout << "大于5的第一个位置:" << distance(ilist.begin(), pos2) + 1 << endl;
ilist.insert(lower_bound(ilist.begin(), ilist.end(), 5), 5);// 在第一个5的位置之前插入一个5
ilist.insert(upper_bound(ilist.begin(), ilist.end(), 5), 5);// 在最后一个5的位置之后插入一个5
// lower_bound() 和 upper_bound()经常一起使用 也就是equal_range
for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
//
pair<list<int>::iterator, list<int>::iterator> range;
range = equal_range(ilist.begin(), ilist.end(), 5);
cout << distance(ilist.begin(), range.first) + 1 << endl;
cout << distance(ilist.begin(), range.second) + 1 << endl;
//
system("pause");
return 0;
}
#include<iostream>
#include<algorithm>
#include<list>
#include<set>
using namespace std;
int main()
{
list<int> ilist;
//set<int> iset;
multiset<int> imset;
// 插入数据
imset.lower_bound(5);
imset.upper_bound(5);
imset.equal_range(5); // 返回pair 一对儿迭代器
for (int i = 1; i <= 9; i++)
ilist.insert(ilist.end(), i);
for (int i = 1; i <= 9; i++)
ilist.insert(ilist.end(), i);
ilist.push_back(5);
ilist.push_back(5);
ilist.push_back(5);
ilist.sort();
for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
list<int>::iterator pos1, pos2;
pos1 = lower_bound(ilist.begin(), ilist.end(), 5);
cout << "第一个5的位置:" << distance(ilist.begin(), pos1) + 1 << endl;
pos2 = upper_bound(ilist.begin(), ilist.end(), 5); // >5的最后一个5的位置下一个位置
cout << "大于5的第一个位置:" << distance(ilist.begin(), pos2) + 1 << endl;
ilist.insert(lower_bound(ilist.begin(), ilist.end(), 5), 5);// 在第一个5的位置之前插入一个5
ilist.insert(upper_bound(ilist.begin(), ilist.end(), 5), 5);// 在最后一个5的位置之后插入一个5
// lower_bound() 和 upper_bound()经常一起使用 也就是equal_range
for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
//
pair<list<int>::iterator, list<int>::iterator> range;
range = equal_range(ilist.begin(), ilist.end(), 5);
cout << distance(ilist.begin(), range.first) + 1 << endl;
cout << distance(ilist.begin(), range.second) + 1 << endl;
//
system("pause");
return 0;
}
lower_bound() // 查找第一个可能的位置
upper_bound() // 查找最后一个可能的位置
equal_range() // 同时可以查找上面的两个
但是 关联式容器(主要是multiset,multimap)有等效的成员函数,性能更佳
STL 算法-查找算法
find()
find_if()
search_n()
search()
find_end()
find_first_of()
adjacent_find()
已序空间查找算法
binary_search()
includes()
lower_bound()
upper_bound()
#include<iostream>
#include<algorithm>
#include<list>
using namespace std;
int main()
{
list<int> ilist;
for (int i = 1; i <= 9; i++)
ilist.insert(ilist.end(), i);
for (int i = 1; i <= 9; i++)
ilist.insert(ilist.end(), i);
ilist.push_back(5);
ilist.push_back(5);
ilist.push_back(5);
ilist.sort();
for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
list<int>::iterator pos1, pos2;
pos1 = lower_bound(ilist.begin(), ilist.end(), 5);
cout << "第一个5的位置:" << distance(ilist.begin(), pos1) + 1 << endl;
pos2 = upper_bound(ilist.begin(), ilist.end(), 5); // >5的最后一个5的位置下一个位置
cout << "大于5的第一个位置:" << distance(ilist.begin(), pos2) + 1 << endl;
ilist.insert(lower_bound(ilist.begin(), ilist.end(), 5), 5);// 在第一个5的位置之前插入一个5
ilist.insert(upper_bound(ilist.begin(), ilist.end(), 5), 5);// 在最后一个5的位置之后插入一个5
// lower_bound() 和 upper_bound()经常一起使用 也就是equal_range
for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
//
pair<list<int>::iterator, list<int>::iterator> range;
range = equal_range(ilist.begin(), ilist.end(), 5);
cout << distance(ilist.begin(), range.first) + 1 << endl;
cout << distance(ilist.begin(), range.second) + 1 << endl;
//
system("pause");
return 0;
}
#include<iostream>
#include<algorithm>
#include<list>
#include<set>
using namespace std;
int main()
{
list<int> ilist;
//set<int> iset;
multiset<int> imset;
// 插入数据
imset.lower_bound(5);
imset.upper_bound(5);
imset.equal_range(5); // 返回pair 一对儿迭代器
for (int i = 1; i <= 9; i++)
ilist.insert(ilist.end(), i);
for (int i = 1; i <= 9; i++)
ilist.insert(ilist.end(), i);
ilist.push_back(5);
ilist.push_back(5);
ilist.push_back(5);
ilist.sort();
for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
list<int>::iterator pos1, pos2;
pos1 = lower_bound(ilist.begin(), ilist.end(), 5);
cout << "第一个5的位置:" << distance(ilist.begin(), pos1) + 1 << endl;
pos2 = upper_bound(ilist.begin(), ilist.end(), 5); // >5的最后一个5的位置下一个位置
cout << "大于5的第一个位置:" << distance(ilist.begin(), pos2) + 1 << endl;
ilist.insert(lower_bound(ilist.begin(), ilist.end(), 5), 5);// 在第一个5的位置之前插入一个5
ilist.insert(upper_bound(ilist.begin(), ilist.end(), 5), 5);// 在最后一个5的位置之后插入一个5
// lower_bound() 和 upper_bound()经常一起使用 也就是equal_range
for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
//
pair<list<int>::iterator, list<int>::iterator> range;
range = equal_range(ilist.begin(), ilist.end(), 5);
cout << distance(ilist.begin(), range.first) + 1 << endl;
cout << distance(ilist.begin(), range.second) + 1 << endl;
//
system("pause");
return 0;
}
相关文章推荐
- Leetcode 92. Reverse Linked List II (Medium) (cpp)
- ev3dev:c语言开发lego ev3主机
- 浅析C语言中printf(),sprintf(),scanf(),sscanf()的用法和区别
- STM8 SPI主机
- 为什么C++里空的类还占一个字节?
- C++面试总结 笔试基础知识常考点
- 4.canny边缘检测
- C++[pp]--课后练习与答案--2.6
- C语言截取字符串
- uva814-The letter Carrier's Rounds
- 笔记,c++中静态对象在程序结束的时候会不会进析构函数?
- C/CPP UTF8编码转成汉字 \u7528\u6237\u4e0d
- [置顶] C和C++中全局变量,局部变量,静态变量和常量
- 【杭电oj2024】C语言合法标识符
- 3.使用cvPyrDown()缩放图像(一个复杂一点的变换)
- 2.对图像进行平滑(一个简单的变换)
- C++领域回调函数总结<一> ---- 常见使用
- C++领域回调函数总结<一> ---- 常见使用
- Effective C++笔记(3)—条款4分析
- C Primer Plus(第五版)中文版第11章编程练习(部分使用新特性,在codeblocks下通过测试,vc++6下运行可能出现错误)