STL 源代码剖析 算法 stl_algo.h -- search
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie
search
-------------------------------------------------------------------------
描写叙述:在序列一[first1, last1) 所涵盖的区间中。查找序列二[first2, last2) 的首次出现点。
思路:
1.遍历序列二
2.假设两序列的当前元素一样,都前进 1
3.否则序列二的迭代器又一次指向開始元素,序列一前进 1 ,序列一的长度减 1
复杂度:
最坏情况是平方: 最多 (last1 - first1) * (last2 - first2) 次比較。 但最坏情况非常少出现。
平均情况下是线性复杂度
源代码:
template <class ForwardIterator1, class ForwardIterator2>
inline ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,ForwardIterator2 first2, ForwardIterator2 last2)
{return __search(first1, last1, first2, last2, distance_type(first1),distance_type(first2));
}//没看源代码之前,还以为会有什么复杂的算法。结果也仅仅是遍历
//假设没有假设(比方有序什么的),STL里的很多算法实现也是挺普通的做法
template <class ForwardIterator1, class ForwardIterator2, class Distance1,class Distance2>
ForwardIterator1 __search(ForwardIterator1 first1, ForwardIterator1 last1,ForwardIterator2 first2, ForwardIterator2 last2,Distance1*, Distance2*) {Distance1 d1 = 0;distance(first1, last1, d1);Distance2 d2 = 0;distance(first2, last2, d2);if (d1 < d2) return last1; //假设第二序列大于第一序列,不可能成为其子序列ForwardIterator1 current1 = first1;ForwardIterator2 current2 = first2;while (current2 != last2) // 我的第一感觉是遍历第一序列。结果人家是遍历第二序列。只是感觉代码写起来应该差点儿相同if (*current1 == *current2) { // 假设这个元素同样。调整,以便比对下一个元素++current1;++current2;}else { //假设这个元素不同if (d1 == d2) //假设两序列一样长了。就不可能成功了return last1;else { //假设两序列不一样长,调整序列标兵current1 = ++first1;current2 = first2;--d1; //已经排序了序列一的一个元素。所以序列一的长度要减 1}}return first1;
}
演示样例:
const char S1[] = "Hello, world!";
const char S2[] = "world";
const int N1 = sizeof(S1) - 1;
const int N2 = sizeof(S2) - 1;const char* p = search(S1, S1 + N1, S2, S2 + N2);
printf("Found subsequence \"%s\" at character %d of sequence \"%s\".\n",S2, p - S1, S1);
STL 源代码剖析 算法 stl_algo.h -- search相关推荐
- STL 源代码剖析 算法 stl_algo.h -- equal_range
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie equal_range(应用于有序区间) ------------------------- ...
- STL 源代码分析 算法 stl_algo.h -- includes
本文senlie原,转载请保留此地址:http://blog.csdn.net/zhengsenlie includes(应用于有序区间) ------------------------------ ...
- 《STL源代码剖析》---stl_set.h阅读笔记
SET是STL中的标准容器,SET里面的元素会依据键值自己主动排序,它不像map那样拥有实值value和键值key的相应,set仅仅有实值.SET的底层实现时RB-tree,当插入到RB-tree中后 ...
- STL之hashtable源代码剖析
// Filename: stl_hashtable.h// 本实作的hashtable採用的是开链法, 其内存布局例如以下// 对于产生哈希冲突的结点, 我们採取在其位置维护一个链表才处理之 // ...
- STL源码剖析 算法章节 算法总览
(以 下 "质变"栏意指mutating,意思是 "会改变其操作对象之内容") 其余注意事项 将无效的迭代器传给某个算法,虽然是一种错误,却不保证能够在编译时期 ...
- STL源码剖析 算法开篇
STL源码剖析 算法章节 算法总览_CHYabc123456hh的博客-CSDN博客 质变算法 质变算法 - 会改变操作对象的数值,比如互换.替换.填写.删除.排列组合.分隔.随机重排.排序等 #in ...
- 【Redis源代码剖析】 - Redis内置数据结构之压缩字典zipmap
原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51111230 今天为大家带来Redis中zipmap数据结构的分析,该结构定义在 ...
- stl非变易算法(二)
这里接着上篇stl非变易算法(一)进行总结.主要解析算法函数count.count_if.mismatch.equal.search.search_n以及find_end.给出算法函数的实现及測试用例 ...
- 【Java集合源代码剖析】TreeMap源代码剖析
转载请注明出处:http://blog.csdn.net/ns_code/article/details/36421085 前言 本文不打算延续前几篇的风格(对全部的源代码加入凝视),由于要理解透Tr ...
最新文章
- leetcode算法题--二叉树中的最长交错路径★
- python匿名函数调用_python3笔记十六:python匿名函数和高阶函数
- 判断vc2005运行库是否以已安装
- PHP的Excel操作
- 三角形周长和【牛客网】牛客网练习赛60
- 创纪录!浪潮云海完成OpenStack Rocky版本全球最大规模单一集群测试!
- web页面如何实现点击按钮进行手机拨号?
- freeMarker fmpp 解析PowerDesign PDM探索
- CCF NOI1024 因子个数
- MathType7新版本数学公式编辑器上线功能特性
- PDF区域文本提取工具
- nodejs实现单点登录系统
- linux ftw()函数使用方法 实例
- input[type='radio'] 自定义样式___通过label标签重置input[radio]样式
- 基础内网信息探针思路
- 外设驱动库开发笔记51:SDP800差压传感器驱动
- 男人买鞋有点难——中国十大皮鞋
- 如何给excel添加开发者选项
- 说话中的引题技巧,及电影刘三姐中的歌词汇总
- 2022年上海市安全员C证最新解析及上海市安全员C证考试技巧
热门文章
- I/O的一些简单操作
- LeetCode: Single Number I II
- 5个很好用的.net 分析工具
- C#多线程强制退出程序
- 不肯嫁的几种男人(转)
- c#使用zlib.net压缩解压byte数组
- Mycat安全_SQL拦截黑名单---MyCat分布式数据库集群架构工作笔记0034
- STM32工作笔记002---STM32初探-概述
- Web前端工作笔记002---$(function(){})和$(document).ready(function(){}) 的区别
- SpringCloud工作笔记038---spring cloud-简单网关权限控制_直接在zuul里面做