针对已序区间执行的算法,执行前提是源区间必须在某个排序准则下已序。

搜寻元素(Searching)

1.检查某个元素是否存在

bool

binary_search(ForwardIterator beg,ForwardIterator end,

const T& value)

bool

binary_search(ForwardIterator beg,ForwardIterator end,

const T& value,

BinaryPredicate op)

以下示范binary_search()的用法

 #include "algostuff.hpp"
using namespace std; int main()
{
list<int> coll;
INSERT_ELEMENTS(coll,,);
PRINT_ELEMENTS(coll);
if(binary_search(coll.begin(),coll.end(),))
cout<<"5 is present"<<endl;
else
cout<<"5 is not present"<<endl;
if(binary_search(coll.begin(),coll.end(),))
cout<<"42 is present"<<endl;
else
cout<<"42 is not present"<<endl;
}

2.检查若干值是否存在

bool

includes(InputIterator beg,

InputIterator end,

InputIterator searchBeg,

InputIterator searchEnd)

bool

includes(InputIterator beg,

InputIterator end,

InputIterator searchBeg,

InputIterator searchEnd,

BinaryPredicate op)

两种形式都用来判断已序区间[beg,end)是否包含另一已序区间[searchBeg,searchEnd)的全部元素

以下程序示范inlcudes()的用法

 #include "algostuff.hpp"
using namespace std; int main()
{
list<int> coll;
vector<int> search;
INSERT_ELEMENTS(coll,,);
PRINT_ELEMENTS(coll,"coll: ");
search.push_back();
search.push_back();
search.push_back();
PRINT_ELEMENTS(search,"search: ");
if(includes(coll.begin(),coll.end(),search.begin(),search.end()))
cout<<"all elements of search are also in coll"<<endl;
else
cout<<"not all elements of search are also in coll"<<endl;
}

3.搜寻第一个或最后一个可能位置

ForwardIterator

lower_bound(ForwardIterator beg,ForwardIterator end,const T& value)

ForwardIterator

lower_bound(ForwardIterator beg,ForwardIterator end,const T& value,

BinaryPredicate op)

ForwardIterator

upper_bound(ForwardIterator beg,ForwardIterator end,const T& value)

ForwardIterator

upper_bound(ForwardIterator beg,ForwardIterator end,const T& value,

BinaryPredicate op)

1.lower_bound()返回第一个“大于等于value”的元素位置。

2.upper_bound()返回第一个“大于value”元素的位置

以下程序示范lower_bound()和upper_bound()的用法

 #include "algostuff.hpp"
using namespace std; int main()
{
list<int> coll;
INSERT_ELEMENTS(coll,,);
INSERT_ELEMENTS(coll,,);
coll.sort();
PRINT_ELEMENTS(coll);
list<int>::iterator pos1,pos2;
pos1=lower_bound(coll.begin(),coll.end(),);
pos2=upper_bound(coll.begin(),coll.end(),);
cout<<"5 could get position "
<<distance(coll.begin(),pos1)+
<<" up to "
<<distance(coll.begin(),pos2)+
<<" without breaking the sorting"<<endl;
coll.insert(lower_bound(coll.begin(),coll.end(),),);
coll.insert(upper_bound(coll.begin(),coll.end(),),);
PRINT_ELEMENTS(coll);
}

3.搜寻第一个和最后一个可能位置

pair<ForwardIterator,ForwardIterator>

equal_range(ForwardIterator beg,ForwardIterator end,const T& value)

pair<ForwardIterator,ForwardIterator>

equal_range(ForwardIterator beg,ForwardIterator end,const T& value,

BinaryPredicate op)

返回值与下式等效: make_pair(lower_bound(...),upper_bound(...))

以下程序展示equal_range()的用法

 #include "algostuff.hpp"
using namespace std; bool bothEvenOrOdd(int elem1,int elem2)
{
return elem1%==elem2%;
} int main()
{
vector<int> coll1;
list<int> coll2;
INSERT_ELEMENTS(coll1,,);
INSERT_ELEMENTS(coll2,,);
PRINT_ELEMENTS(coll1,"coll1: ");
PRINT_ELEMENTS(coll2,"coll2: ");
if(equal(coll1.begin(),coll1.end(),coll2.begin()))
cout<<"coll1==coll2"<<endl;
else
cout<<"coll1!=coll2"<<endl;
if(equal(coll1.begin(),coll1.end(),coll2.begin(),bothEvenOrOdd))
cout<<"even and odd elements correspond"<<endl;
else
cout<<"even and odd elements do not correspond"<<endl;
}

合并元素(Merging)

1.两个已序集合的总和

OutputIterator

merge(InputIterator source1Beg,InputIterator source1End,

InputIterator source2Beg,InputIterator source2End,

OutputIterator destBeg)

OutputIterator

merge(InputIterator source1Beg,InputIterator source1End,

InputIterator source2Beg,InputIterator source2End,

OutputIterator destBeg,BinaryPredicate op)

1.两者都是将两个源区间的元素合并,使得“以destBeg起始的目标区间”内含两个源区间所有元素。

2.目标区间内的所有元素都将按顺序排序

下面这个例子展示merge()的用法

 #include <iterator>
#include "algostuff.hpp"
using namespace std; int main()
{
list<int> coll1;
set<int> coll2;
INSERT_ELEMENTS(coll1,,);
INSERT_ELEMENTS(coll2,,);
PRINT_ELEMENTS(coll1,"coll1: ");
PRINT_ELEMENTS(coll2,"coll2: ");
cout<<"merged: ";
merge(coll1.begin(),coll1.end(),coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
cout<<endl;
}

2.两个已序集合的并集

OutputIterator

set_union(InputIterator source1Beg,InputIterator source1End,

InputIterator source2Beg,InputIterator source2End,

OutputIterator destBeg)

OutputIterator

set_union(InputIterator source1Beg,InputIterator source1End,

InputIterator source2Beg,InputIterator source2End,

OutputIterator destBeg,BinaryPredicate op)

与merge不一样的是,目标区间的元素要不来自第一源区间,要不就来自第二源区间,或是同时来自两个源区间。例如:

source1:1 2 2 4 6 7 7 9

source2:2 2 2 3 6 6 8 9

dest:1 2 2 2 3 4 6 6 7 7 8 9

3.两个已序集合的交集

OutputIterator

set_intersection(InputIterator source1Beg,InputIterator source1End,

InputIterator source2Beg,InputIterator source2End,

OutputIterator destBeg)

OutputIterator

set_intersection(InputIterator source1Beg,InputIterator source1End,

InputIterator source2Beg,InputIterator source2End,

OutputIterator destBeg,BinaryPredicate op)

4.两个已序集合的差集

OutputIterator

set_difference(InputIterator source1Beg,InputIterator source1End,

InputIterator source2Beg,InputIterator source2End,

OutputIterator destBeg)

OutputIterator

set_difference(InputIterator source1Beg,InputIterator source1End,

InputIterator source2Beg,InputIterator source2End,

OutputIterator destBeg,BinaryPredicate op)

目标区间的元素只存在于第一源区间,不存在与第二源区间。

STL学习笔记(已序区间算法)的更多相关文章

  1. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  2. STL学习笔记7 ---- algorithm(算法)

    STL中算可以分为三种, 1.变序型队列算法,可以改变容器内的数据: 2.非变序型队列算法,处理容器内的数据而不改变他们 : 3.通用数值算法,这涉及到很多专业领域的算术操作,这里不做介绍. 第一是变 ...

  3. STL学习笔记(非变动性算法)

    辅助函数 本节跟以后几节将对所有STL算法逐一详细讨论.为了简化这些例子,我们使用了一些辅助函数,分别用于对容器进行输出跟插入操作. #ifndef ALGOSTUFF_HPP #define ALG ...

  4. STL学习笔记--算法

    关于STL算法需要注意的是: (1) 所有STL算法被设计用来处理一个或多个迭代器区间.第一个区间通常以起点和终点表示,至于其他区间,多数情况下只需提供起点即可,其终点可自动以第一区间的元素数推导出来 ...

  5. STL学习笔记(算法概述)

    算法头文件 要运用C++标准程序库的算法,首先必须包含头文件<algorithm> 使用STL算法时,经常需要用到仿函数以及函数配接器.它们定义域<functional>头文件 ...

  6. C++ STL 已序区间查找算法

    #include <iostream>#include <algorithm>#include <list>#include <functional># ...

  7. Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据

    Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...

  8. Effective STL 学习笔记 Item 30: 保证目标区间足够大

    Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...

  9. Effective STL 学习笔记: Item 22 ~ 24

    Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...

随机推荐

  1. UVA 10334 Ray Through Glasses

    自己手动画了第三项发现f[3]=5;就猜斐波那契了.实际上光线分为两种距离外界有2面玻璃,1面玻璃 其分别时n-1次反射,n-2次反射形成的 故推出斐波那契. 手动一些f1,f2,f3就OK #inc ...

  2. (3) python--matplotlib

    (一)1.如何绘制散点图 import numpy as np import matplotlib.pyplot as plt # 如何绘制散点图 # 先随机生成数据 x = np.array(ran ...

  3. vue.js基本使用

    #原创,转载请留言联系 什么是vue.js Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架. Vue 只关注视图层, 采用自底向上增量开发的设计. Vue 的目 ...

  4. Sql Jions 的简易理解

    Sql Jions 的简易理解 Select  * from TableA A  left jion TableB  B on  A.key = B.key Select  * from TableA ...

  5. Lowest Common Ancestor of a Binary Search Tree -- LeetCode

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  6. final-第十章

    1,nas概念 NAS就是一种直接连接到用户网络中,并具有信息存储功能的硬件设备. NAS是由处理器,文件服务管理模块,和存储部分等组成的. 2,san概念 SAN是一种利用光纤集线器,光纤路由器,光 ...

  7. 每天一个linux命令7之telnet

    telnet :和端口通信         telnet   192.168.196.200 20 退出:      ctrl+]  然后在telnet 命令行输入 quit  

  8. 如何隐藏 video 元素的下载按钮

    1. 使用 video 元素的 ControlList API <video controls controlsList="nodownload"></video ...

  9. Maven创建多模块项目(包括依赖版本号的统一更新)

    0.多项目工程的文件夹及依赖关系 bus-core-api为公共项目,app-web-ui依赖bus-core-api,app-desktop-ui依赖bus-core-api 1.创建一个父Mave ...

  10. SQL Server大量数据秒级插入/新增/删除

    原文:SQL Server大量数据秒级插入/新增/删除 1.快速保存,该方法有四个参数,第一个参数为数据库连接,第二个参数为需要保存的DataTable,该参数的TableName属性需要设置为数据库 ...