STL学习笔记(已序区间算法)

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

搜寻元素(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()的用法

 1 #include "algostuff.hpp"
 2 using namespace std;
 3
 4 int main()
 5 {
 6     list<int> coll;
 7     INSERT_ELEMENTS(coll,1,9);
 8     PRINT_ELEMENTS(coll);
 9     if(binary_search(coll.begin(),coll.end(),5))
10         cout<<"5 is present"<<endl;
11     else
12         cout<<"5 is not present"<<endl;
13     if(binary_search(coll.begin(),coll.end(),42))
14         cout<<"42 is present"<<endl;
15     else
16         cout<<"42 is not present"<<endl;
17 }

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()的用法

 1 #include "algostuff.hpp"
 2 using namespace std;
 3
 4 int main()
 5 {
 6     list<int> coll;
 7     vector<int> search;
 8     INSERT_ELEMENTS(coll,1,9);
 9     PRINT_ELEMENTS(coll,"coll: ");
10     search.push_back(3);
11     search.push_back(4);
12     search.push_back(7);
13     PRINT_ELEMENTS(search,"search: ");
14     if(includes(coll.begin(),coll.end(),search.begin(),search.end()))
15         cout<<"all elements of search are also in coll"<<endl;
16     else
17         cout<<"not all elements of search are also in coll"<<endl;
18 }

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()的用法

 1 #include "algostuff.hpp"
 2 using namespace std;
 3
 4 int main()
 5 {
 6     list<int> coll;
 7     INSERT_ELEMENTS(coll,1,9);
 8     INSERT_ELEMENTS(coll,1,9);
 9     coll.sort();
10     PRINT_ELEMENTS(coll);
11     list<int>::iterator pos1,pos2;
12     pos1=lower_bound(coll.begin(),coll.end(),5);
13     pos2=upper_bound(coll.begin(),coll.end(),5);
14     cout<<"5 could get position "
15         <<distance(coll.begin(),pos1)+1
16         <<" up to "
17         <<distance(coll.begin(),pos2)+1
18         <<" without breaking the sorting"<<endl;
19     coll.insert(lower_bound(coll.begin(),coll.end(),3),3);
20     coll.insert(upper_bound(coll.begin(),coll.end(),7),7);
21     PRINT_ELEMENTS(coll);
22 }

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()的用法

 1 #include "algostuff.hpp"
 2 using namespace std;
 3
 4 bool bothEvenOrOdd(int elem1,int elem2)
 5 {
 6     return elem1%2==elem2%2;
 7 }
 8
 9 int main()
10 {
11     vector<int> coll1;
12     list<int> coll2;
13     INSERT_ELEMENTS(coll1,1,7);
14     INSERT_ELEMENTS(coll2,3,9);
15     PRINT_ELEMENTS(coll1,"coll1: ");
16     PRINT_ELEMENTS(coll2,"coll2: ");
17     if(equal(coll1.begin(),coll1.end(),coll2.begin()))
18         cout<<"coll1==coll2"<<endl;
19     else
20         cout<<"coll1!=coll2"<<endl;
21     if(equal(coll1.begin(),coll1.end(),coll2.begin(),bothEvenOrOdd))
22         cout<<"even and odd elements correspond"<<endl;
23     else
24         cout<<"even and odd elements do not correspond"<<endl;
25 }

合并元素(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()的用法

 1 #include <iterator>
 2 #include "algostuff.hpp"
 3 using namespace std;
 4
 5 int main()
 6 {
 7     list<int> coll1;
 8     set<int> coll2;
 9     INSERT_ELEMENTS(coll1,1,6);
10     INSERT_ELEMENTS(coll2,3,8);
11     PRINT_ELEMENTS(coll1,"coll1: ");
12     PRINT_ELEMENTS(coll2,"coll2: ");
13     cout<<"merged: ";
14     merge(coll1.begin(),coll1.end(),coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
15     cout<<endl;
16 }

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)

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

时间: 2024-12-06 12:45:17

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

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

辅助函数 本节跟以后几节将对所有STL算法逐一详细讨论.为了简化这些例子,我们使用了一些辅助函数,分别用于对容器进行输出跟插入操作. for_each()算法 for_each()算法非常灵活,它可以以不同的方式存取.处理.修改每一个元素 UnaryProc for_each(InputIterator beg,InputIterator end,UnaryProc op); 1.对与区间[beg,end)中的每一个元素调用:op(elem) 2.返回op(已在算法内部被变动过)的一个副本 3.

STL学习笔记(算法概述)

算法头文件 要运用C++标准程序库的算法,首先必须包含头文件<algorithm> 使用STL算法时,经常需要用到仿函数以及函数配接器.它们定义域<functional>头文件中. 算法的分类 可以按以下分类方式描述各个STL算法: 非变动性算法(nonmodifying algorithms) 变动性算法(modifying algorithms) 移除性算法(removing algorithms) 变序性算法(mutating algorithms) 排序算法(sorting

Linux系统学习笔记:序

Linux系统学习笔记:序 ??Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和网络协议.它支持32位和64位硬件.Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统. 本人使用的Linux为Ubuntu,主要以<APUE>(第3版)为学习蓝本. 1. Unix/Linux 体系结构 如图: 内核的接口被称为系统调用.公用函数库构建在

STL学习笔记(变序性算法)

变序性算法改变元素的次序,但不改变元素值. 这些算法不能用于关联式容器,因为在关联式容器中,元素有一定的次序,不能随意变动. 逆转元素次序 void reverse(BidirectionalIterator beg,BidirectionalIterator end) OutputIterator reverse_copy(BidirectionalIterator sourceBeg,BidirectionalIterator sourceEnd, OutputIterator destBe

STL学习笔记--&gt;初识STL

“这里要用char类型”; “这里要用int类型”; “其实实现这个方法只需要把另一个方法的返回值的类型和传入参数的类型改成float类型就实现了”; “其实这个算法只需要把以前写的那个稍微改动一下就行了”; ……………… 学过面向对象语言的都知道GP这个概念,就是泛型程序设计,说的再明白点就是编写不依赖于具体数据类型的程序,C++作为一门面向对象语言,当然也有泛型这个概念,这就不得不提STL(Standard Template Library,标准模板库),是被融入C++标准程序库里面的一个高

STL学习笔记(第五章 STL组件)

STL组件 若干精心勾画的组件共同合作,构筑起STL的基础.这些组件最关键的是容器.迭代器和算法. 下图演示了STL组件之间的合作 容器(Containers) 容器类别(简称容器)用来管理一组元素.为了适应不同需求,STL提供了不同类型的容器. 总的来说,容器可分为两类: 1.序列式容器Sequence containers,此乃可序群集,其中每个元素均有固定位置(取决于插入时机和地点,和元素值无关). STL提供三个定义好的序列式容器:vector.deque和list. 2.关联式容器As

STL学习笔记(序列式容器)

Vector Vector是一个动态数组. 1.Vector的操作函数 构造.拷贝和析构 vector<Elem> c //产生一个空vector ,其中没有任何元素 vector<Elem> c1(c2) //产生另一个同型vector的副本,(所有元素都被拷贝) vector<Elem> c(n) //利用元素的default构造函数生成一个大小为n的vector vector<Elem> c(n,elem) //产生一个大小为n的vector,每个元素

STL学习笔记--3、迭代器iterator与traits编程

iterator模式:提供一种方法,依次巡访某个聚合物(容器)所含的各个元素,而无需暴露该聚合物的内部表达式. 1.迭代器设计思维 STL在于将数据容器和算法分开,彼此独立,最后再以一帖粘合剂将它们撮合在一起.只要对算法给予不同的迭代器,就可以对不同容器进行相同的操作. 算法find():接受两个迭代器和一个搜寻目标. //摘自SGI<stl_algo.h> template <class InputIterator, class T> InputIterator find(Inp

【视频编解码&#183;学习笔记】8. 熵编码算法:基本算法列举 &amp; 指数哥伦布编码

一.H.264中的熵编码基本方法: 熵编码具有消除数据之间统计冗余的功能,在编码端作为最后一道工序,将语法元素写入输出码流 熵解码作为解码过程的第一步,将码流解析出语法元素供后续步骤重建图像使用 在H.264的标准协议中,不同的语法元素指定了不同的熵编码方法.在协议文档中共指定了10种语法元素的描述符,这些描述符表达了码流解析为语法元素值的方法,其中包含了H.264标准所支持的所有熵编码方法: 语法元素描述符 编码方法 b(8) 8位二进制比特位串,用于描述rbsp_byte() f(n) n位