子序列匹配(search,find_end,search_n)
search
版本一返回[first1,last1-(last2-first2)]中的第一个iterator i,使得满足对于[first2,last2)中的每个iterator j,*(i+(j-first2))==*j,也就是在在每个以i开头的第一个字序列中,必须与第二个子序列相同
版本二返回[first1,last1-(last2-first2)]中的第一个iterator i,使得满足对于[first2,last2)中的每个iterator j,表达式_Comp(*(i+(j-first2)),*j)为true,如果不满足,就向后移动第一个子序列的i,直到找到第一个满足的。
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search(
ForwardIterator1 _First1,
ForwardIterator1 _Last1,
ForwardIterator2 _First2,
ForwardIterator2 _Last2
);
template<class ForwardIterator1, class ForwardIterator2, class Pr>
ForwardIterator1 search(
ForwardIterator1 _First1,
ForwardIterator1 _Last1,
ForwardIterator2 _First2,
ForwardIterator2 _Last2
BinaryPredicate _Comp
);
search_n
找序列中count个相邻的元素形成的子序列,所有值都等于value,或binary_pred(*i,value)为true
count允许为0,允许0个元素值等于value,返回first
template<class ForwardIterator1,class Integer,class T>
ForwardIterator1 search_n(
ForwardIterator1 _First1,
ForwardIterator1 _Last1,
Integer count,
const T& value
);
template<class ForwardIterator1,class Integer,class T, class Binaypredicate>
ForwardIterator1 search_n(
ForwardIterator1 _First1,
ForwardIterator1 _Last1,
Integer count,
const T& value
BinaryPredicate _Comp
);
adjcent_find
//版本一:默认操作是operator==
template <class _ForwardIter>
_ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last) {
/*
情况1:若输入区间为空,则直接返回尾端last;
情况2:若输入区间不为空,且存在相邻重复元素,则返回相邻元素的第一个元素的位置;
情况3:若输入区间不为空,但是不存在相邻重复元素,则直接返回尾端last;
*/
//情况1:
if (__first == __last)//若输入区间为空
return __last;//直接返回last
//情况2:
_ForwardIter __next = __first;//定义当前位置的下一个位置(即当前元素的相邻元素)
while(++__next != __last) {//若还没到达尾端,执行while循环
if (*__first == *__next)//相邻元素值相等,则找到相邻重复元素
return __first;//返回第一个元素的位置
__first = __next;//若暂时找不到,则继续找,直到到达区间尾端
}
//情况3:
return __last;//直接返回尾端last
} //版本二:用户指定的二元操作pred
//实现过程和版本一一样,只是判断规则不同
template <class _ForwardIter, class _BinaryPredicate>
_ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last,
_BinaryPredicate __binary_pred);
find
找到第一个与value相等的元素返回。
template <class _InputIter, class _Tp>
inline _InputIter find(_InputIter __first, _InputIter __last,
const _Tp& __val,
input_iterator_tag)
{//若尚未到达区间的尾端,且未找到匹配的值,则继续查找
while (__first != __last && !(*__first == __val))
++__first;
//若找到匹配的值,则返回该位置
//若找不到,即到达区间尾端,此时first=last,则返回first
return __first;
}
find_if
template <class _InputIter, class _Predicate>
inline _InputIter find_if(_InputIter __first, _InputIter __last,_Predicate __pred,)
{//若尚未到达区间的尾端,且未找到匹配的值,则继续查找
while (__first != __last && !__pred(*__first))
++__first;
//若找到匹配的值,则返回该位置
//若找不到,即到达区间尾端,此时first=last,则返回first
return __first;
}
find_end
search是找到第一个匹配的子序列,而find_end()是找到最后一个匹配的子序列,其他与search相同;实现也是利用search,先找到第一个出现的点,然后再次基础上向后移动寻找再次出现的点
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_end(
ForwardIterator1 _First1,
ForwardIterator1 _Last1,
ForwardIterator2 _First2,
ForwardIterator2 _Last2
);
template<class ForwardIterator1, class ForwardIterator2, class Pr>
ForwardIterator1 find_end(
ForwardIterator1 _First1,
ForwardIterator1 _Last1,
ForwardIterator2 _First2,
ForwardIterator2 _Last2
BinaryPredicate _Comp
);
find_first_of
在[first2,last2]某些元素作为查找目标,寻找他们在[first1,last1]区间内第一次出现的点。用两层for循环实现。
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_first_of(
ForwardIterator1 _First1,
ForwardIterator1 _Last1,
ForwardIterator2 _First2,
ForwardIterator2 _Last2
);
template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
ForwardIterator1 find_first_of(
ForwardIterator1 _First1,
ForwardIterator1 _Last1,
ForwardIterator2 _First2,
ForwardIterator2 _Last2,
BinaryPredicate _Comp
);
子序列匹配(search,find_end,search_n)的更多相关文章
- 洛谷CF264D Colorful Stones(子序列匹配,思维)
洛谷题目传送门 神仙思维题. 对于两个字符串的匹配问题,似乎之前蒟蒻写的HAOI2010最长公共子序列题解中提到的建网格图模型是一种套路? 给一个稍微强一点的样例(把字母换成了ABC) AABCB B ...
- Codeforces 163A Substring and Subsequence:dp【子串与子序列匹配】
题目链接:http://codeforces.com/problemset/problem/163/A 题意: 给你两个字符串a,b,问你有多少对"(a的子串,b的子序列)"可以匹 ...
- 【C++】子序列匹配问题
/* 一个串的“子序列”(subsequence)是将这个串中的一些字符提取出来得到一个新串,并且不改变它们的相对位置关系.例如,串"XDoi","XianYu!&quo ...
- STL--STL和她的小伙伴们:
STL--概述: 标准模板库(StandardTemplateLibrary,STL),是C++程序设计语言标准模板库.STL是由Alexander Stepanov.Meng Lee和David R ...
- Python正则匹配
使用Re模块 首先生成一个匹配模式pattern,如pattern='.test' 然后使用re.match(pattern,str)或者search()匹配调用 match跟search的区别: m ...
- Distinct Subsequences(不同子序列的个数)——b字符串在a字符串中出现的次数、动态规划
Given a string S and a string T, count the number of distinct subsequences ofT inS. A subsequence of ...
- Leetcode 115.不同的子序列
不同的子序列 给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数. 一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串.(例 ...
- C++STL算法速查
非变易算法 /* 第21章 非变易算法 Non-modifying sequence operations 21.0 advance, distance 为了了解模板,先了解一下这两个迭代器操作函 ...
- stl非变易算法(二)
这里接着上篇stl非变易算法(一)进行总结.主要解析算法函数count.count_if.mismatch.equal.search.search_n以及find_end.给出算法函数的实现及測试用例 ...
随机推荐
- SQL-31 获取select * from employees对应的执行计划
题目描述 获取select * from employees对应的执行计划 explain select * from employees explain 用于获得表的所有细节
- 2019-02-25 EST 科技文翻译
The Definition of Theme and Rheme The point of departure is equally presented to the speaker and to ...
- git工具学习
最近实习的时候,遇到git工具,发现好强大之前没用过,特来学习下,然后自己注册了一个github账号,结合git命令练习一下,git的安装就不说了. 学习资料来源:廖雪峰Git教程 git简介: gi ...
- curl 返回头部和正文
头部string(195) "HTTP/1.1 200 OK Server: openresty/1.7.7.1 Date: Wed, 05 Sep 2018 13:18:33 GMT Co ...
- POJ 2369 Permutations(置换群概念题)
Description We remind that the permutation of some final set is a one-to-one mapping of the set onto ...
- html 调用ocx控件
!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/x ...
- ORA-16019搭建DG设置归档线程参数报错
#操作描述:搭建DG,主库修改参数log_archive_dest_1线程路径报错 ORA-16019: cannot use LOG_ARCHIVE_DEST_1 with LOG_ARCHIVE_ ...
- ZK集群搭建和配置
1. 克隆三台空虚拟机(含有jdk和lrzsz),修改网络ip,并关闭虚拟机的防火墙 临时关闭:service iptables stop 永久关闭:chkconfig iptables off 2. ...
- django安装命令
通过pip安装Django ==指定版本号 pip install Django==2.0.2 查看djangoshifou安装成功:1.进入python ,2.import django 查 ...
- dp——环形石子合并(区间dp)
环形的解决很巧妙 #include <iostream> #include <cstring> #include <string> #include <map ...