STL 源代码分析 算法 stl_algo.h -- includes
本文senlie原,转载请保留此地址:http://blog.csdn.net/zhengsenlie
includes(应用于有序区间)
-------------------------------------------------------------
描写叙述:S1和S2都必须是有序集合。推断序列二 S2 是否"涵盖于"序列一 S1,即"S2的每个元素是否都出现于 S1中"
思路:
1.遍历两个区间。直到当中一个走完
2.假设序列二的元素小于序列一的元素。则在序列一中不可能有元素等于序列二的当前元素了,直接返回 false
3.假设序列一的元素小于序列二的元素。则序列一前进 1
4.假设两序列元素相当,都前进 1
5.当有一个序列走完时。推断序列二是否走完了。
复杂度:最多 2 * ((last1- first1) + (last2 - first2)) - 1次比較
源代码:
// S1 和 S2是递增序列。 以 operator < 运行比較操作
// 假设是 RandomAccessIterator 能够得到区间长度,假设区间1的长度小于区间2的能够返回 false 提前结束循环
// 只是这里是 InputIterator , 可能是由于这点对效率影响不大吧, stl里没有专门针对 RandomAccessIterator 的优化
template <class InputIterator1, class InputIterator2>
bool includes(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2) {
while (first1 != last1 && first2 != last2) // 两个区间都尚未走完
if (*first2 < *first1) // 序列二的元素小于序列一的元素,返回 false
return false;
else if(*first1 < *first2) // 序列一的元素小于序列二的元素,序列一前进 1
++first1;
else //两序列元素相等,各自前进 1
++first1, ++first2; return first2 == last2; //有一个序列走完了,推断是序列二是否走完了,假设是,涵盖情况成立,否则,不成立
}
演示样例:
int A1[] = { 1, 2, 3, 4, 5, 6, 7 };
int A2[] = { 1, 4, 7 };
int A3[] = { 2, 7, 9 };
int A4[] = { 1, 1, 2, 3, 5, 8, 13, 21 };
int A5[] = { 1, 2, 13, 13 };
int A6[] = { 1, 1, 3, 21 };
const int N1 = sizeof(A1) / sizeof(int);
const int N2 = sizeof(A2) / sizeof(int);
const int N3 = sizeof(A3) / sizeof(int);
const int N4 = sizeof(A4) / sizeof(int);
const int N5 = sizeof(A5) / sizeof(int);
const int N6 = sizeof(A6) / sizeof(int);
cout << "A2 contained in A1: "
<< (includes(A1, A1 + N1, A2, A2 + N2) ?
"true" : "false") << endl; // true
cout << "A3 contained in A1: "
<< (includes(A1, A1 + N2, A3, A3 + N3) ? "true" : "false") << endl; // false
cout << "A5 contained in A4: "
<< (includes(A4, A4 + N4, A5, A5 + N5) ?
"true" : "false") << endl; // false
cout << "A6 contained in A4: "
<< (includes(A4, A4 + N4, A6, A6 + N6) ? "true" : "false") << endl; // true
STL 源代码分析 算法 stl_algo.h -- includes的更多相关文章
- STL 源代码分析 算法 stl_algo.h -- merge
本文senlie原版的,转载请保留此地址:http://blog.csdn.net/zhengsenlie merge (应用于有序区间) ------------------------------ ...
- STL 源代码分析 算法 stl_algo.h -- binary_search
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie binary_search -------------------------------- ...
- STL 源代码分析 算法 stl_algo.h -- pre_permutation
本文senlie原版的,转载请保留此地址:http://blog.csdn.net/zhengsenlie pre_permutation ------------------------------ ...
- STL 源代码分析 算法 stl_heap.h
本文senlie原版的.转载请保留此地址:http://blog.csdn.net/zhengsenlie heap ----------------------------------------- ...
- STL 源代码剖析 算法 stl_algo.h -- search
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie search --------------------------------------- ...
- STL 源代码剖析 算法 stl_algo.h -- partial_sort / partial_sort_copy
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie partial_sort / partial_sort_copy ------------- ...
- STL 源代码剖析 算法 stl_algo.h -- lower_bound
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie lower_bound(应用于有序区间) ------------------------- ...
- STL 源代码剖析 算法 stl_algo.h -- random_shuffle
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie random_shuffle ------------------------------- ...
- STL 源代码剖析 算法 stl_algo.h -- merge sort
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie merge sort ----------------------------------- ...
随机推荐
- 在Windows下搭建C++11 编译环境(附下载,包括mingw-build,TDM-GCC, nuwen MinGW Distro)
由于现实的一些原因,并不是所有人都能很方便的享受到C++11 特性.特别是C++ Primer 第五版 和 The C++ Programming Language 第四版等全面C++ 11 铺开以后 ...
- ASP漏洞+SQL注入的入侵方法
本文就是想对装上了防火墙的主机,进行入侵攻击的大概思路小结一下. 首先当然是用扫描器对这台服务器(以下简称主机A)进行常规的扫描,得到初步的信息.再用nmap -sS IP -P0 -p 139 ,透 ...
- State Design Pattern 状态设计模式
设置好内部状态,然后依据不同的函数作为行为模式,进行状态转换. 有点像Finite Automata算法,两者的思想是一样的. 会Finite Automata,那么这个设计模式就非常easy了. # ...
- 监听手机晃动(摇一摇)SensorEventListener
import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; ...
- Python写入文件,但是发现文件为空,竟然未写入!
问题描述: fw=open(r'C:\test.txt','w') s="Hello World!" fw.write(s) ========== 此时查看C盘根目录,发现test ...
- 面试经典-设计包含min函数的栈
问题:设计包含min函数的栈(栈) 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素. 要求函数min.push以及pop的时间复杂度都是O(1). 解答:push 和pop的时间复杂度 ...
- HDU-1039-Easier Done Than Said?(Java && 没用正則表達式是我的遗憾.....)
Easier Done Than Said? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
- bootstrap之WaitForIdle&&Clear
(上篇文章写完才发现.说好的按顺序可是回头一看全然不是按顺序的)明明WaitForIdle才是第一个.哎,老了,后脑勺不行了. WaitForIdle package io.appium.androi ...
- Python标准库:内置函数dict(iterable, **kwarg)
本函数是从可迭代对象来创建新字典.比方一个元组组成的列表,或者一个字典对象. 样例: #dict() #以键对方式构造字典 d1 = dict(one = 1, two = 2, a = 3) pri ...
- 工信部表态支持Linux,可是Linux又是什么呢?
近日,工信部高层官员出面表态:工信部大力支持发展国产Linux操作系统,可是,Linux又是什么呢?假设依照工信部的说法,发展所谓"国产Linux".恐怕要给国家带来麻烦. 大家知 ...