本文为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相关推荐

  1. STL 源代码剖析 算法 stl_algo.h -- equal_range

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie equal_range(应用于有序区间) ------------------------- ...

  2. STL 源代码分析 算法 stl_algo.h -- includes

    本文senlie原,转载请保留此地址:http://blog.csdn.net/zhengsenlie includes(应用于有序区间) ------------------------------ ...

  3. 《STL源代码剖析》---stl_set.h阅读笔记

    SET是STL中的标准容器,SET里面的元素会依据键值自己主动排序,它不像map那样拥有实值value和键值key的相应,set仅仅有实值.SET的底层实现时RB-tree,当插入到RB-tree中后 ...

  4. STL之hashtable源代码剖析

    // Filename: stl_hashtable.h// 本实作的hashtable採用的是开链法, 其内存布局例如以下// 对于产生哈希冲突的结点, 我们採取在其位置维护一个链表才处理之 // ...

  5. STL源码剖析 算法章节 算法总览

    (以 下 "质变"栏意指mutating,意思是 "会改变其操作对象之内容") 其余注意事项 将无效的迭代器传给某个算法,虽然是一种错误,却不保证能够在编译时期 ...

  6. STL源码剖析 算法开篇

    STL源码剖析 算法章节 算法总览_CHYabc123456hh的博客-CSDN博客 质变算法 质变算法 - 会改变操作对象的数值,比如互换.替换.填写.删除.排列组合.分隔.随机重排.排序等 #in ...

  7. 【Redis源代码剖析】 - Redis内置数据结构之压缩字典zipmap

    原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51111230 今天为大家带来Redis中zipmap数据结构的分析,该结构定义在 ...

  8. stl非变易算法(二)

    这里接着上篇stl非变易算法(一)进行总结.主要解析算法函数count.count_if.mismatch.equal.search.search_n以及find_end.给出算法函数的实现及測试用例 ...

  9. 【Java集合源代码剖析】TreeMap源代码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/36421085 前言 本文不打算延续前几篇的风格(对全部的源代码加入凝视),由于要理解透Tr ...

最新文章

  1. leetcode算法题--二叉树中的最长交错路径★
  2. python匿名函数调用_python3笔记十六:python匿名函数和高阶函数
  3. 判断vc2005运行库是否以已安装
  4. PHP的Excel操作
  5. 三角形周长和【牛客网】牛客网练习赛60
  6. 创纪录!浪潮云海完成OpenStack Rocky版本全球最大规模单一集群测试!
  7. web页面如何实现点击按钮进行手机拨号?
  8. freeMarker fmpp 解析PowerDesign PDM探索
  9. CCF NOI1024 因子个数
  10. MathType7新版本数学公式编辑器上线功能特性
  11. PDF区域文本提取工具
  12. nodejs实现单点登录系统
  13. linux ftw()函数使用方法 实例
  14. input[type='radio'] 自定义样式___通过label标签重置input[radio]样式
  15. 基础内网信息探针思路
  16. 外设驱动库开发笔记51:SDP800差压传感器驱动
  17. 男人买鞋有点难——中国十大皮鞋
  18. 如何给excel添加开发者选项
  19. 说话中的引题技巧,及电影刘三姐中的歌词汇总
  20. 2022年上海市安全员C证最新解析及上海市安全员C证考试技巧

热门文章

  1. I/O的一些简单操作
  2. LeetCode: Single Number I II
  3. 5个很好用的.net 分析工具
  4. C#多线程强制退出程序
  5. 不肯嫁的几种男人(转)
  6. c#使用zlib.net压缩解压byte数组
  7. Mycat安全_SQL拦截黑名单---MyCat分布式数据库集群架构工作笔记0034
  8. STM32工作笔记002---STM32初探-概述
  9. Web前端工作笔记002---$(function(){})和$(document).ready(function(){}) 的区别
  10. SpringCloud工作笔记038---spring cloud-简单网关权限控制_直接在zuul里面做