STL源码剖析——STL算法之find查找算法

柔情只为你懂 2022-08-12 19:28 328阅读 0赞

前言

由于在前文的《STL算法剖析》中,源码剖析非常多,不方便学习,也不方便以后复习,这里把这些算法进行归类,对他们单独的源码剖析进行讲解。本文介绍的STL算法中的find、search查找算法。在STL源码中有关算法的函数大部分在本文介绍,包含findand find_if、adjacent_find、search、search_n、lower_bound、 upper_bound、 equal_range、binary_search、find_first_of、find_end相关算法,下面对这些算法的源码进行了详细的剖析,并且适当给出应用例子,增加我们对其理解,方便我们使用这些算法。具体详见下面源码剖析。

查找算法源码剖析

  1. // find and find_if.
  2. //查找区间[first,last)内元素第一个与value值相等的元素,并返回其位置
  3. //其中find函数是采用默认的equality操作operator==
  4. //find_if是采用用户自行指定的操作pred
  5. //若find函数萃取出来的迭代器类型为输入迭代器input_iterator_tag,则调用此函数
  6. template <class _InputIter, class _Tp>
  7. inline _InputIter find(_InputIter __first, _InputIter __last,
  8. const _Tp& __val,
  9. input_iterator_tag)
  10. {//若尚未到达区间的尾端,且未找到匹配的值,则继续查找
  11. while (__first != __last && !(*__first == __val))
  12. ++__first;
  13. //若找到匹配的值,则返回该位置
  14. //若找不到,即到达区间尾端,此时first=last,则返回first
  15. return __first;
  16. }
  17. //若find_if函数萃取出来的迭代器类型为输入迭代器input_iterator_tag,则调用此函数
  18. template <class _InputIter, class _Predicate>
  19. inline _InputIter find_if(_InputIter __first, _InputIter __last,
  20. _Predicate __pred,
  21. input_iterator_tag)
  22. {//若尚未到达区间的尾端,且未找到匹配的值,则继续查找
  23. while (__first != __last && !__pred(*__first))
  24. ++__first;
  25. //若找到匹配的值,则返回该位置
  26. //若找不到,即到达区间尾端,此时first=last,则返回first
  27. return __first;
  28. }
  29. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  30. //若find函数萃取出来的迭代器类型为随机访问迭代器random_access_iterator_tag,则调用此函数
  31. template <class _RandomAccessIter, class _Tp>
  32. _RandomAccessIter find(_RandomAccessIter __first, _RandomAccessIter __last,
  33. const _Tp& __val,
  34. random_access_iterator_tag)
  35. {
  36. typename iterator_traits<_RandomAccessIter>::difference_type __trip_count
  37. = (__last - __first) >> 2;
  38. for ( ; __trip_count > 0 ; --__trip_count) {
  39. if (*__first == __val) return __first;
  40. ++__first;
  41. if (*__first == __val) return __first;
  42. ++__first;
  43. if (*__first == __val) return __first;
  44. ++__first;
  45. if (*__first == __val) return __first;
  46. ++__first;
  47. }
  48. switch(__last - __first) {
  49. case 3:
  50. if (*__first == __val) return __first;
  51. ++__first;
  52. case 2:
  53. if (*__first == __val) return __first;
  54. ++__first;
  55. case 1:
  56. if (*__first == __val) return __first;
  57. ++__first;
  58. case 0:
  59. default:
  60. return __last;
  61. }
  62. }
  63. //若find_if函数萃取出来的迭代器类型为随机访问迭代器random_access_iterator_tag,则调用此函数
  64. template <class _RandomAccessIter, class _Predicate>
  65. _RandomAccessIter find_if(_RandomAccessIter __first, _RandomAccessIter __last,
  66. _Predicate __pred,
  67. random_access_iterator_tag)
  68. {
  69. typename iterator_traits<_RandomAccessIter>::difference_type __trip_count
  70. = (__last - __first) >> 2;
  71. for ( ; __trip_count > 0 ; --__trip_count) {
  72. if (__pred(*__first)) return __first;
  73. ++__first;
  74. if (__pred(*__first)) return __first;
  75. ++__first;
  76. if (__pred(*__first)) return __first;
  77. ++__first;
  78. if (__pred(*__first)) return __first;
  79. ++__first;
  80. }
  81. switch(__last - __first) {
  82. case 3:
  83. if (__pred(*__first)) return __first;
  84. ++__first;
  85. case 2:
  86. if (__pred(*__first)) return __first;
  87. ++__first;
  88. case 1:
  89. if (__pred(*__first)) return __first;
  90. ++__first;
  91. case 0:
  92. default:
  93. return __last;
  94. }
  95. }
  96. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  97. /*find函数功能:Returns an iterator to the first element in the range [first,last) that compares equal to val.
  98. If no such element is found, the function returns last.
  99. find函数原型:
  100. template <class InputIterator, class T>
  101. InputIterator find (InputIterator first, InputIterator last, const T& val);
  102. */
  103. //find函数对外接口
  104. template <class _InputIter, class _Tp>
  105. inline _InputIter find(_InputIter __first, _InputIter __last,
  106. const _Tp& __val)
  107. {
  108. __STL_REQUIRES(_InputIter, _InputIterator);
  109. __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
  110. typename iterator_traits<_InputIter>::value_type, _Tp);
  111. //首先萃取出first迭代器的类型,根据迭代器的类型调用不同的函数
  112. return find(__first, __last, __val, __ITERATOR_CATEGORY(__first));
  113. }
  114. /*find_if函数功能:Returns an iterator to the first element in the range [first,last) for which pred returns true.
  115. If no such element is found, the function returns last.
  116. find_if函数原型:
  117. template <class InputIterator, class UnaryPredicate>
  118. InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred);
  119. */
  120. //find_if 函数对外接口
  121. template <class _InputIter, class _Predicate>
  122. inline _InputIter find_if(_InputIter __first, _InputIter __last,
  123. _Predicate __pred) {
  124. __STL_REQUIRES(_InputIter, _InputIterator);
  125. __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
  126. typename iterator_traits<_InputIter>::value_type);
  127. //首先萃取出first迭代器的类型,根据迭代器的类型调用不同的函数
  128. return find_if(__first, __last, __pred, __ITERATOR_CATEGORY(__first));
  129. }
  130. //find和find_if函数举例:
  131. /*
  132. #include <iostream> // std::cout
  133. #include <algorithm> // std::find_if
  134. #include <vector> // std::vector
  135. bool IsOdd (int i) {
  136. return ((i%2)==1);
  137. }
  138. int main () {
  139. std::vector<int> myvector;
  140. myvector.push_back(10);
  141. myvector.push_back(25);
  142. myvector.push_back(40);
  143. myvector.push_back(55);
  144. std::vector<int>::iterator it = std::find_if (myvector.begin(), myvector.end(), IsOdd);
  145. std::cout << "The first odd value is " << *it << '\n';
  146. // using std::find with vector and iterator:
  147. it = find (myvector.begin(), myvector.end(), 40);
  148. if (it != myvector.end())
  149. std::cout << "Element found in myvector: " << *it << '\n';
  150. else
  151. std::cout << "Element not found in myints\n";
  152. return 0;
  153. }
  154. Output:
  155. The first odd value is 25
  156. Element found in myvector: 40
  157. */
  158. // adjacent_find.
  159. //查找区间[first,last)内第一次重复的相邻元素
  160. //若存在返回相邻元素的第一个元素位置
  161. //若不存在返回last位置
  162. /*该函数有两个版本:第一版本是默认操作operator==;第二版本是用户指定的二元操作pred
  163. 函数对外接口的原型:
  164. equality (1):默认操作是operator==
  165. template <class ForwardIterator>
  166. ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last);
  167. predicate (2):用户指定的二元操作pred
  168. template <class ForwardIterator, class BinaryPredicate>
  169. ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last,
  170. BinaryPredicate pred);
  171. */
  172. //版本一:默认操作是operator==
  173. template <class _ForwardIter>
  174. _ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last) {
  175. __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  176. __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
  177. _EqualityComparable);
  178. /*
  179. 情况1:若输入区间为空,则直接返回尾端last;
  180. 情况2:若输入区间不为空,且存在相邻重复元素,则返回相邻元素的第一个元素的位置;
  181. 情况3:若输入区间不为空,但是不存在相邻重复元素,则直接返回尾端last;
  182. */
  183. //情况1:
  184. if (__first == __last)//若输入区间为空
  185. return __last;//直接返回last
  186. //情况2:
  187. _ForwardIter __next = __first;//定义当前位置的下一个位置(即当前元素的相邻元素)
  188. while(++__next != __last) {//若还没到达尾端,执行while循环
  189. if (*__first == *__next)//相邻元素值相等,则找到相邻重复元素
  190. return __first;//返回第一个元素的位置
  191. __first = __next;//若暂时找不到,则继续找,直到到达区间尾端
  192. }
  193. //情况3:
  194. return __last;//直接返回尾端last
  195. }
  196. //版本二:用户指定的二元操作pred
  197. //实现过程和版本一一样,只是判断规则不同
  198. template <class _ForwardIter, class _BinaryPredicate>
  199. _ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last,
  200. _BinaryPredicate __binary_pred) {
  201. __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  202. __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
  203. typename iterator_traits<_ForwardIter>::value_type,
  204. typename iterator_traits<_ForwardIter>::value_type);
  205. if (__first == __last)
  206. return __last;
  207. _ForwardIter __next = __first;
  208. while(++__next != __last) {
  209. //如果找到相邻元素符合用户指定条件,就返回第一元素位置
  210. if (__binary_pred(*__first, *__next))
  211. return __first;
  212. __first = __next;
  213. }
  214. return __last;
  215. }
  216. //adjacent_find函数举例:
  217. /*
  218. #include <iostream> // std::cout
  219. #include <algorithm> // std::adjacent_find
  220. #include <vector> // std::vector
  221. bool myfunction (int i, int j) {
  222. return (i==j);
  223. }
  224. int main () {
  225. int myints[] = {5,20,5,30,30,20,10,10,20};
  226. std::vector<int> myvector (myints,myints+8);
  227. std::vector<int>::iterator it;
  228. // using default comparison:
  229. it = std::adjacent_find (myvector.begin(), myvector.end());
  230. if (it!=myvector.end())
  231. std::cout << "the first pair of repeated elements are: " << *it << '\n';
  232. //using predicate comparison:
  233. it = std::adjacent_find (++it, myvector.end(), myfunction);
  234. if (it!=myvector.end())
  235. std::cout << "the second pair of repeated elements are: " << *it << '\n';
  236. return 0;
  237. }
  238. Output:
  239. the first pair of repeated elements are: 30
  240. the second pair of repeated elements are: 10
  241. */
  242. // search.
  243. //在序列一[first1,last1)所涵盖的区间中,查找序列二[first2,last2)的首次出现点
  244. //该查找函数有两个版本:
  245. //版本一:使用默认的equality操作operator==
  246. //版本二:用户根据需要自行指定操作规则
  247. /*search函数功能:Searches the range [first1,last1) for the first occurrence of the sequence defined by [first2,last2),
  248. and returns an iterator to its first element, or last1 if no occurrences are found.
  249. search函数的原型:
  250. equality (1):版本一
  251. template <class ForwardIterator1, class ForwardIterator2>
  252. ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1,
  253. ForwardIterator2 first2, ForwardIterator2 last2);
  254. predicate (2):版本二
  255. template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
  256. ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1,
  257. ForwardIterator2 first2, ForwardIterator2 last2,
  258. BinaryPredicate pred);
  259. */
  260. //版本一:使用默认的equality操作operator==
  261. template <class _ForwardIter1, class _ForwardIter2>
  262. _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
  263. _ForwardIter2 __first2, _ForwardIter2 __last2)
  264. {
  265. __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
  266. __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
  267. __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
  268. typename iterator_traits<_ForwardIter1>::value_type,
  269. typename iterator_traits<_ForwardIter2>::value_type);
  270. // Test for empty ranges
  271. if (__first1 == __last1 || __first2 == __last2)
  272. return __first1;
  273. // Test for a pattern of length 1.
  274. _ForwardIter2 __tmp(__first2);
  275. ++__tmp;
  276. if (__tmp == __last2)
  277. return find(__first1, __last1, *__first2);
  278. // General case.
  279. _ForwardIter2 __p1, __p;
  280. __p1 = __first2; ++__p1;
  281. _ForwardIter1 __current = __first1;
  282. while (__first1 != __last1) {//若还没到达区间尾端
  283. __first1 = find(__first1, __last1, *__first2);//查找*first2在区间[first1,last1)首次出现的位置
  284. if (__first1 == __last1)//若在[first1,last1)中不存在*first2,即在[first1,last1)不存在子序列[first2,last2)
  285. return __last1;//则直接返回区间尾端
  286. __p = __p1;
  287. __current = __first1;
  288. if (++__current == __last1)//若[first1,last1)只有一个元素,即序列[first1,last1)小于序列[first2,last2)
  289. return __last1;//不可能成为其子序列,返回last1
  290. while (*__current == *__p) {//若两个序列相对应的值相同
  291. if (++__p == __last2)//若序列[first2,last2)只有两个元素,且与序列一匹配
  292. return __first1;//则返回匹配的首次位置
  293. if (++__current == __last1)//若第一个序列小于第二个序列
  294. return __last1;//返回last1
  295. }
  296. ++__first1;
  297. }
  298. return __first1;
  299. }
  300. //版本二:用户根据需要自行指定操作规则
  301. template <class _ForwardIter1, class _ForwardIter2, class _BinaryPred>
  302. _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
  303. _ForwardIter2 __first2, _ForwardIter2 __last2,
  304. _BinaryPred __predicate)
  305. {
  306. __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
  307. __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
  308. __STL_BINARY_FUNCTION_CHECK(_BinaryPred, bool,
  309. typename iterator_traits<_ForwardIter1>::value_type,
  310. typename iterator_traits<_ForwardIter2>::value_type);
  311. // Test for empty ranges
  312. if (__first1 == __last1 || __first2 == __last2)
  313. return __first1;
  314. // Test for a pattern of length 1.
  315. _ForwardIter2 __tmp(__first2);
  316. ++__tmp;
  317. if (__tmp == __last2) {
  318. while (__first1 != __last1 && !__predicate(*__first1, *__first2))
  319. ++__first1;
  320. return __first1;
  321. }
  322. // General case.
  323. _ForwardIter2 __p1, __p;
  324. __p1 = __first2; ++__p1;
  325. _ForwardIter1 __current = __first1;
  326. while (__first1 != __last1) {
  327. while (__first1 != __last1) {
  328. if (__predicate(*__first1, *__first2))
  329. break;
  330. ++__first1;
  331. }
  332. while (__first1 != __last1 && !__predicate(*__first1, *__first2))
  333. ++__first1;
  334. if (__first1 == __last1)
  335. return __last1;
  336. __p = __p1;
  337. __current = __first1;
  338. if (++__current == __last1) return __last1;
  339. while (__predicate(*__current, *__p)) {
  340. if (++__p == __last2)
  341. return __first1;
  342. if (++__current == __last1)
  343. return __last1;
  344. }
  345. ++__first1;
  346. }
  347. return __first1;
  348. }
  349. // search_n. Search for __count consecutive copies of __val.
  350. //在序列[first,last)查找连续count个符合条件值value元素的位置
  351. //该查找函数有两个版本:
  352. //版本一:使用默认的equality操作operator==
  353. //版本二:用户根据需要自行指定操作规则
  354. /*search_n函数功能:Searches the range [first,last) for a sequence of count elements,
  355. each comparing equal to val (or for which pred returns true).
  356. search_n函数的原型:
  357. equality (1):版本一
  358. template <class ForwardIterator, class Size, class T>
  359. ForwardIterator search_n (ForwardIterator first, ForwardIterator last,
  360. Size count, const T& val);
  361. predicate (2):版本二
  362. template <class ForwardIterator, class Size, class T, class BinaryPredicate>
  363. ForwardIterator search_n ( ForwardIterator first, ForwardIterator last,
  364. Size count, const T& val, BinaryPredicate pred );
  365. */
  366. //版本一:使用默认的equality操作operator==
  367. template <class _ForwardIter, class _Integer, class _Tp>
  368. _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
  369. _Integer __count, const _Tp& __val) {
  370. __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  371. __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
  372. _EqualityComparable);
  373. __STL_REQUIRES(_Tp, _EqualityComparable);
  374. if (__count <= 0)
  375. return __first;
  376. else {//首先查找value第一次出现的位置
  377. __first = find(__first, __last, __val);
  378. while (__first != __last) {//若出现的位置不是区间尾端
  379. _Integer __n = __count - 1;//更新个数,下面只需查找n=count-1个连续相同value即可
  380. _ForwardIter __i = __first;
  381. ++__i;//从当前位置的下一个位置开始查找
  382. //若没有到达区间尾端,且个数n大于0,且区间元素与value值相等
  383. while (__i != __last && __n != 0 && *__i == __val) {
  384. ++__i;//继续查找
  385. --__n;//减少查找的次数,因为已经找到value再次出现
  386. }
  387. if (__n == 0)//若区间尚未到达尾端,但是count个value已经查找到
  388. return __first;//则输出查找到的首次出现value的位置
  389. else
  390. __first = find(__i, __last, __val);//若尚未找到连续count个value值的位置,则找出value下次出现的位置,并准备下一次while循环
  391. }
  392. return __last;
  393. }
  394. }
  395. //版本二:用户根据需要自行指定操作规则
  396. template <class _ForwardIter, class _Integer, class _Tp, class _BinaryPred>
  397. _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
  398. _Integer __count, const _Tp& __val,
  399. _BinaryPred __binary_pred) {
  400. __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  401. __STL_BINARY_FUNCTION_CHECK(_BinaryPred, bool,
  402. typename iterator_traits<_ForwardIter>::value_type, _Tp);
  403. if (__count <= 0)
  404. return __first;
  405. else {
  406. while (__first != __last) {
  407. if (__binary_pred(*__first, __val))
  408. break;
  409. ++__first;
  410. }
  411. while (__first != __last) {
  412. _Integer __n = __count - 1;
  413. _ForwardIter __i = __first;
  414. ++__i;
  415. while (__i != __last && __n != 0 && __binary_pred(*__i, __val)) {
  416. ++__i;
  417. --__n;
  418. }
  419. if (__n == 0)
  420. return __first;
  421. else {
  422. while (__i != __last) {
  423. if (__binary_pred(*__i, __val))
  424. break;
  425. ++__i;
  426. }
  427. __first = __i;
  428. }
  429. }
  430. return __last;
  431. }
  432. }
  433. //search和search_n函数举例:
  434. /*
  435. #include <iostream> // std::cout
  436. #include <algorithm> // std::search_n
  437. #include <vector> // std::vector
  438. bool mypredicate (int i, int j) {
  439. return (i==j);
  440. }
  441. int main () {
  442. int myints[]={10,20,30,30,20,10,10,20};
  443. std::vector<int> myvector (myints,myints+8);
  444. std::vector<int>::iterator it;
  445. // using default comparison:
  446. it = std::search_n (myvector.begin(), myvector.end(), 2, 30);
  447. if (it!=myvector.end())
  448. std::cout << "two 30s found at position " << (it-myvector.begin()) << '\n';
  449. else
  450. std::cout << "match not found\n";
  451. // using predicate comparison:
  452. it = std::search_n (myvector.begin(), myvector.end(), 2, 10, mypredicate);
  453. if (it!=myvector.end())
  454. std::cout << "two 10s found at position " << int(it-myvector.begin()) << '\n';
  455. else
  456. std::cout << "match not found\n";
  457. int needle1[] = {10,20};
  458. // using default comparison:
  459. it = std::search (myvector.begin(), myvector.end(), needle1, needle1+2);
  460. if (it!=myvector.end())
  461. std::cout << "needle1 found at position " << (it-myvector.begin()) << '\n';
  462. else
  463. std::cout << "needle1 not found\n";
  464. // using predicate comparison:
  465. int needle2[] = {30,20,10};
  466. it = std::search (myvector.begin(), myvector.end(), needle2, needle2+3, mypredicate);
  467. if (it!=myvector.end())
  468. std::cout << "needle2 found at position " << (it-myvector.begin()) << '\n';
  469. else
  470. std::cout << "needle2 not found\n";
  471. return 0;
  472. }
  473. Output:
  474. two 30s found at position 2
  475. two 10s found at position 5
  476. needle1 found at position 0
  477. needle2 found at position 3
  478. */
  479. // Binary search (lower_bound, upper_bound, equal_range, binary_search).
  480. template <class _ForwardIter, class _Tp, class _Distance>
  481. _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
  482. const _Tp& __val, _Distance*)
  483. {
  484. _Distance __len = 0;
  485. distance(__first, __last, __len);//求取整个区间的长度len
  486. _Distance __half;
  487. _ForwardIter __middle;//定义区间的中间迭代器
  488. while (__len > 0) {//若区间不为空,则在区间[first,last)开始查找value值
  489. __half = __len >> 1;//向右移一位,相当于除以2,即取区间的中间值
  490. __middle = __first;//middle初始化为区间的起始位置
  491. advance(__middle, __half);//middle向后移half位,此时middle为区间的中间值
  492. if (*__middle < __val) {//将value值与中间值比较,即是二分查找,若中间值小于value,则继续查找右半部分
  493. //下面两行令first指向middle的下一个位置
  494. __first = __middle;
  495. ++__first;
  496. __len = __len - __half - 1;//调整查找区间的长度
  497. }
  498. else
  499. __len = __half;//否则查找左半部分
  500. }
  501. return __first;
  502. }
  503. //在已排序区间[first,last)查找value值
  504. //若该区间存在与value相等的元素,则返回指向第一个与value相等的迭代器
  505. //若该区间不存在与value相等的元素,则返回指向第一个不小于value值的迭代器
  506. //若该区间的任何元素都比value值小,则返回last
  507. /*
  508. 函数功能:Returns an iterator pointing to the first element in the range [first,last) which does not compare less than val.
  509. 函数原型:
  510. default (1) :版本一采用operator<比较
  511. template <class ForwardIterator, class T>
  512. ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last,
  513. const T& val);
  514. custom (2) :版本二采用仿函数comp比较规则
  515. template <class ForwardIterator, class T, class Compare>
  516. ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last,
  517. const T& val, Compare comp);
  518. */
  519. //版本一
  520. template <class _ForwardIter, class _Tp>
  521. inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
  522. const _Tp& __val) {
  523. __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  524. __STL_REQUIRES_SAME_TYPE(_Tp,
  525. typename iterator_traits<_ForwardIter>::value_type);
  526. __STL_REQUIRES(_Tp, _LessThanComparable);
  527. return __lower_bound(__first, __last, __val,
  528. __DISTANCE_TYPE(__first));
  529. }
  530. template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
  531. _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
  532. const _Tp& __val, _Compare __comp, _Distance*)
  533. {
  534. _Distance __len = 0;
  535. distance(__first, __last, __len);//求取整个区间的长度len
  536. _Distance __half;
  537. _ForwardIter __middle;//定义区间的中间迭代器
  538. while (__len > 0) {//若区间不为空,则在区间[first,last)开始查找value值
  539. __half = __len >> 1;//向右移一位,相当于除以2,即取区间的中间值
  540. __middle = __first;//middle初始化为区间的起始位置
  541. advance(__middle, __half);//middle向后移half位,此时middle为区间的中间值
  542. if (__comp(*__middle, __val)) {//若comp判断为true,则继续在右半部分查找
  543. //下面两行令first指向middle的下一个位置
  544. __first = __middle;
  545. ++__first;
  546. __len = __len - __half - 1;//调整查找区间的长度
  547. }
  548. else
  549. __len = __half;//否则查找左半部分
  550. }
  551. return __first;
  552. }
  553. //版本二:
  554. template <class _ForwardIter, class _Tp, class _Compare>
  555. inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
  556. const _Tp& __val, _Compare __comp) {
  557. __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  558. __STL_REQUIRES_SAME_TYPE(_Tp,
  559. typename iterator_traits<_ForwardIter>::value_type);
  560. __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
  561. return __lower_bound(__first, __last, __val, __comp,
  562. __DISTANCE_TYPE(__first));
  563. }
  564. template <class _ForwardIter, class _Tp, class _Distance>
  565. _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
  566. const _Tp& __val, _Distance*)
  567. {
  568. _Distance __len = 0;
  569. distance(__first, __last, __len);//求取整个区间的长度len
  570. _Distance __half;
  571. _ForwardIter __middle;//定义区间的中间迭代器
  572. while (__len > 0) {//若区间不为空,则在区间[first,last)开始查找value值
  573. __half = __len >> 1;//向右移一位,相当于除以2,即取区间的中间值
  574. __middle = __first;//middle初始化为区间的起始位置
  575. advance(__middle, __half);//middle向后移half位,此时middle为区间的中间值
  576. if (__val < *__middle)//若value小于中间元素值
  577. __len = __half;//查找左半部分
  578. else {
  579. //下面两行令first指向middle的下一个位置
  580. __first = __middle;
  581. ++__first;
  582. __len = __len - __half - 1;//更新len的值
  583. }
  584. }
  585. return __first;
  586. }
  587. //在已排序区间[first,last)查找value值
  588. //返回大于value值的第一个元素的迭代器
  589. /*
  590. 函数功能:Returns an iterator pointing to the first element in the range [first,last) which compares greater than val.
  591. 函数原型:
  592. default (1) :版本一采用operator<比较
  593. template <class ForwardIterator, class T>
  594. ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,
  595. const T& val);
  596. custom (2) :版本二采用仿函数comp比较规则
  597. template <class ForwardIterator, class T, class Compare>
  598. ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,
  599. const T& val, Compare comp);
  600. */
  601. //版本一
  602. template <class _ForwardIter, class _Tp>
  603. inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
  604. const _Tp& __val) {
  605. __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  606. __STL_REQUIRES_SAME_TYPE(_Tp,
  607. typename iterator_traits<_ForwardIter>::value_type);
  608. __STL_REQUIRES(_Tp, _LessThanComparable);
  609. return __upper_bound(__first, __last, __val,
  610. __DISTANCE_TYPE(__first));
  611. }
  612. template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
  613. _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
  614. const _Tp& __val, _Compare __comp, _Distance*)
  615. {
  616. _Distance __len = 0;
  617. distance(__first, __last, __len);
  618. _Distance __half;
  619. _ForwardIter __middle;
  620. while (__len > 0) {
  621. __half = __len >> 1;
  622. __middle = __first;
  623. advance(__middle, __half);
  624. if (__comp(__val, *__middle))
  625. __len = __half;
  626. else {
  627. __first = __middle;
  628. ++__first;
  629. __len = __len - __half - 1;
  630. }
  631. }
  632. return __first;
  633. }
  634. //版本二
  635. template <class _ForwardIter, class _Tp, class _Compare>
  636. inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
  637. const _Tp& __val, _Compare __comp) {
  638. __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  639. __STL_REQUIRES_SAME_TYPE(_Tp,
  640. typename iterator_traits<_ForwardIter>::value_type);
  641. __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
  642. return __upper_bound(__first, __last, __val, __comp,
  643. __DISTANCE_TYPE(__first));
  644. }
  645. //函数举例
  646. /*
  647. #include <iostream> // std::cout
  648. #include <algorithm> // std::lower_bound, std::upper_bound, std::sort
  649. #include <vector> // std::vector
  650. int main () {
  651. int myints[] = {10,20,30,30,20,10,10,20};
  652. std::vector<int> v(myints,myints+8); // 10 20 30 30 20 10 10 20
  653. std::sort (v.begin(), v.end()); // 10 10 10 20 20 20 30 30
  654. std::vector<int>::iterator low,up;
  655. low=std::lower_bound (v.begin(), v.end(), 20); // ^
  656. up= std::upper_bound (v.begin(), v.end(), 20); // ^
  657. std::cout << "lower_bound at position " << (low- v.begin()) << '\n';
  658. std::cout << "upper_bound at position " << (up - v.begin()) << '\n';
  659. return 0;
  660. }
  661. Output:
  662. lower_bound at position 3
  663. upper_bound at position 6
  664. */
  665. template <class _ForwardIter, class _Tp, class _Distance>
  666. pair<_ForwardIter, _ForwardIter>
  667. __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
  668. _Distance*)
  669. {
  670. _Distance __len = 0;
  671. distance(__first, __last, __len);//计算区间的长度len
  672. _Distance __half;
  673. _ForwardIter __middle, __left, __right;
  674. while (__len > 0) {//若区间非空
  675. __half = __len >> 1;//len右移一位,相等于除以2,即half为区间的长度的一半
  676. __middle = __first;//初始化middle的值
  677. advance(__middle, __half);//前进middle位置,使其指向区间中间位置
  678. if (*__middle < __val) {//若指定元素value大于中间元素值,则在右半部分继续查找
  679. //下面两行使first指向middle的下一个位置,即右半区间的起始位置
  680. __first = __middle;
  681. ++__first;
  682. __len = __len - __half - 1;//更新待查找区间的长度
  683. }
  684. else if (__val < *__middle)//若指定元素value小于中间元素值,则在左半部分继续查找
  685. __len = __half;//更新待查找区间的长度
  686. else {//若指定元素value等于中间元素值
  687. //在前半部分找lower_bound位置
  688. __left = lower_bound(__first, __middle, __val);
  689. advance(__first, __len);
  690. //在后半部分找upper_bound
  691. __right = upper_bound(++__middle, __first, __val);
  692. return pair<_ForwardIter, _ForwardIter>(__left, __right);//返回pair对象,第一个迭代器为left,第二个迭代器为right
  693. }
  694. }
  695. return pair<_ForwardIter, _ForwardIter>(__first, __first);
  696. }
  697. //查找区间与value相等的相邻重复元素的起始位置和结束位置
  698. //注意:[first,last)是已排序,思想还是采用二分查找法
  699. //同样也有两个版本
  700. /*
  701. 函数功能:Returns the bounds of the subrange that includes all the elements of the range [first,last) with values equivalent to val.
  702. 函数原型:
  703. default (1) :版本一默认operator<
  704. template <class ForwardIterator, class T>
  705. pair<ForwardIterator,ForwardIterator>
  706. equal_range (ForwardIterator first, ForwardIterator last, const T& val);
  707. custom (2) :版本二采用仿函数comp
  708. template <class ForwardIterator, class T, class Compare>
  709. pair<ForwardIterator,ForwardIterator>
  710. equal_range (ForwardIterator first, ForwardIterator last, const T& val,
  711. Compare comp);
  712. */
  713. //版本一
  714. template <class _ForwardIter, class _Tp>
  715. inline pair<_ForwardIter, _ForwardIter>
  716. equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {
  717. __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  718. __STL_REQUIRES_SAME_TYPE(_Tp,
  719. typename iterator_traits<_ForwardIter>::value_type);
  720. __STL_REQUIRES(_Tp, _LessThanComparable);
  721. return __equal_range(__first, __last, __val,
  722. __DISTANCE_TYPE(__first));
  723. }
  724. template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
  725. pair<_ForwardIter, _ForwardIter>
  726. __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
  727. _Compare __comp, _Distance*)
  728. {
  729. _Distance __len = 0;
  730. distance(__first, __last, __len);
  731. _Distance __half;
  732. _ForwardIter __middle, __left, __right;
  733. while (__len > 0) {
  734. __half = __len >> 1;
  735. __middle = __first;
  736. advance(__middle, __half);
  737. if (__comp(*__middle, __val)) {
  738. __first = __middle;
  739. ++__first;
  740. __len = __len - __half - 1;
  741. }
  742. else if (__comp(__val, *__middle))
  743. __len = __half;
  744. else {
  745. __left = lower_bound(__first, __middle, __val, __comp);
  746. advance(__first, __len);
  747. __right = upper_bound(++__middle, __first, __val, __comp);
  748. return pair<_ForwardIter, _ForwardIter>(__left, __right);
  749. }
  750. }
  751. return pair<_ForwardIter, _ForwardIter>(__first, __first);
  752. }
  753. //版本二
  754. template <class _ForwardIter, class _Tp, class _Compare>
  755. inline pair<_ForwardIter, _ForwardIter>
  756. equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
  757. _Compare __comp) {
  758. __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  759. __STL_REQUIRES_SAME_TYPE(_Tp,
  760. typename iterator_traits<_ForwardIter>::value_type);
  761. __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
  762. return __equal_range(__first, __last, __val, __comp,
  763. __DISTANCE_TYPE(__first));
  764. }
  765. //equal_range函数举例:
  766. /*
  767. #include <iostream> // std::cout
  768. #include <algorithm> // std::equal_range, std::sort
  769. #include <vector> // std::vector
  770. bool mygreater (int i,int j) { return (i>j); }
  771. int main () {
  772. int myints[] = {10,20,30,30,20,10,10,20};
  773. std::vector<int> v(myints,myints+8); // 10 20 30 30 20 10 10 20
  774. std::pair<std::vector<int>::iterator,std::vector<int>::iterator> bounds;
  775. // using default comparison:
  776. std::sort (v.begin(), v.end()); // 10 10 10 20 20 20 30 30
  777. bounds=std::equal_range (v.begin(), v.end(), 20); // ^ ^
  778. std::cout << "bounds at positions " << (bounds.first - v.begin());
  779. std::cout << " and " << (bounds.second - v.begin()) << '\n';
  780. // using "mygreater" as comp:
  781. std::sort (v.begin(), v.end(), mygreater); // 30 30 20 20 20 10 10 10
  782. bounds=std::equal_range (v.begin(), v.end(), 20, mygreater); // ^ ^
  783. std::cout << "bounds at positions " << (bounds.first - v.begin());
  784. std::cout << " and " << (bounds.second - v.begin()) << '\n';
  785. return 0;
  786. }
  787. Output:
  788. bounds at positions 3 and 6
  789. bounds at positions 2 and 5
  790. */
  791. //二分查找法
  792. //注意:[first,last)是已排序
  793. //同样也有两个版本
  794. /*
  795. 函数功能:Returns true if any element in the range [first,last) is equivalent to val, and false otherwise.
  796. 函数原型:
  797. default (1) :版本一默认operator<
  798. template <class ForwardIterator, class T>
  799. bool binary_search (ForwardIterator first, ForwardIterator last,
  800. const T& val);
  801. custom (2) :版本二采用仿函数comp
  802. template <class ForwardIterator, class T, class Compare>
  803. bool binary_search (ForwardIterator first, ForwardIterator last,
  804. const T& val, Compare comp);
  805. */
  806. template <class _ForwardIter, class _Tp>
  807. bool binary_search(_ForwardIter __first, _ForwardIter __last,
  808. const _Tp& __val) {
  809. __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  810. __STL_REQUIRES_SAME_TYPE(_Tp,
  811. typename iterator_traits<_ForwardIter>::value_type);
  812. __STL_REQUIRES(_Tp, _LessThanComparable);
  813. _ForwardIter __i = lower_bound(__first, __last, __val);//调用二分查找函数,并返回不小于value值的第一个迭代器位置i
  814. return __i != __last && !(__val < *__i);
  815. }
  816. template <class _ForwardIter, class _Tp, class _Compare>
  817. bool binary_search(_ForwardIter __first, _ForwardIter __last,
  818. const _Tp& __val,
  819. _Compare __comp) {
  820. __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  821. __STL_REQUIRES_SAME_TYPE(_Tp,
  822. typename iterator_traits<_ForwardIter>::value_type);
  823. __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
  824. _ForwardIter __i = lower_bound(__first, __last, __val, __comp);//调用二分查找函数,并返回不小于value值的第一个迭代器位置i
  825. return __i != __last && !__comp(__val, *__i);
  826. }
  827. // find_first_of, with and without an explicitly supplied comparison function.
  828. //以[first2,last2)区间内的某些元素为查找目标,寻找他们在[first1,last1)区间首次出现的位置
  829. //find_first_of函数有两个版本:
  830. //版本一:提供默认的equality操作operator==
  831. //版本二:提供用户自行指定的操作规则comp
  832. /*
  833. 函数功能:Returns an iterator to the first element in the range [first1,last1) that matches any of the elements in [first2,last2).
  834. If no such element is found, the function returns last1.
  835. 函数原型:
  836. equality (1):版本一
  837. template <class ForwardIterator1, class ForwardIterator2>
  838. ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1,
  839. ForwardIterator2 first2, ForwardIterator2 last2);
  840. predicate (2):版本二
  841. template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
  842. ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1,
  843. ForwardIterator2 first2, ForwardIterator2 last2,
  844. BinaryPredicate pred);
  845. */
  846. //版本一:提供默认的equality操作operator==
  847. template <class _InputIter, class _ForwardIter>
  848. _InputIter find_first_of(_InputIter __first1, _InputIter __last1,
  849. _ForwardIter __first2, _ForwardIter __last2)
  850. {
  851. __STL_REQUIRES(_InputIter, _InputIterator);
  852. __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  853. __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
  854. typename iterator_traits<_InputIter>::value_type,
  855. typename iterator_traits<_ForwardIter>::value_type);
  856. for ( ; __first1 != __last1; ++__first1) //若序列一不为空,则遍历序列一,每次指定一个元素
  857. //以下,根据序列二的每个元素
  858. for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
  859. if (*__first1 == *__iter)//若序列一的元素等于序列二的元素,则表示找到
  860. return __first1;//返回找到的位置
  861. return __last1;//否则没找到
  862. }
  863. //版本二:提供用户自行指定的操作规则comp
  864. template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
  865. _InputIter find_first_of(_InputIter __first1, _InputIter __last1,
  866. _ForwardIter __first2, _ForwardIter __last2,
  867. _BinaryPredicate __comp)
  868. {
  869. __STL_REQUIRES(_InputIter, _InputIterator);
  870. __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  871. __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
  872. typename iterator_traits<_InputIter>::value_type,
  873. typename iterator_traits<_ForwardIter>::value_type);
  874. for ( ; __first1 != __last1; ++__first1)
  875. for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
  876. if (__comp(*__first1, *__iter))
  877. return __first1;
  878. return __last1;
  879. }
  880. //find_first_of函数举例:
  881. /*
  882. #include <iostream> // std::cout
  883. #include <algorithm> // std::find_first_of
  884. #include <vector> // std::vector
  885. #include <cctype> // std::tolower
  886. bool comp_case_insensitive (char c1, char c2) {
  887. return (std::tolower(c1)==std::tolower(c2));
  888. }
  889. int main () {
  890. int mychars[] = {'a','b','c','A','B','C'};
  891. std::vector<char> haystack (mychars,mychars+6);
  892. std::vector<char>::iterator it;
  893. int needle[] = {'A','B','C'};
  894. // using default comparison:
  895. it = find_first_of (haystack.begin(), haystack.end(), needle, needle+3);
  896. if (it!=haystack.end())
  897. std::cout << "The first match is: " << *it << '\n';
  898. // using predicate comparison:
  899. it = find_first_of (haystack.begin(), haystack.end(),
  900. needle, needle+3, comp_case_insensitive);
  901. if (it!=haystack.end())
  902. std::cout << "The first match is: " << *it << '\n';
  903. return 0;
  904. }
  905. Output:
  906. The first match is: A
  907. The first match is: a
  908. */
  909. // find_end, with and without an explicitly supplied comparison function.
  910. // Search [first2, last2) as a subsequence in [first1, last1), and return
  911. // the *last* possible match. Note that find_end for bidirectional iterators
  912. // is much faster than for forward iterators.
  913. // find_end for forward iterators.
  914. //若萃取出来的迭代器类型为正向迭代器forward_iterator_tag,则调用此函数
  915. template <class _ForwardIter1, class _ForwardIter2>
  916. _ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
  917. _ForwardIter2 __first2, _ForwardIter2 __last2,
  918. forward_iterator_tag, forward_iterator_tag)
  919. {
  920. if (__first2 == __last2)//若第二个区间为空
  921. return __last1;//则直接返回第一个区间的尾端
  922. else {
  923. _ForwardIter1 __result = __last1;
  924. while (1) {
  925. //以下利用search函数查找出某个子序列的首次出现点;若找不到直接返回last1
  926. _ForwardIter1 __new_result
  927. = search(__first1, __last1, __first2, __last2);
  928. if (__new_result == __last1)//若返回的位置为尾端,则表示没找到
  929. return __result;//返回last1
  930. else {//若在[first1,last1)中找到[first2,last2)首次出现的位置,继续准备下一次查找
  931. __result = __new_result;//更新返回的位置
  932. __first1 = __new_result;//更新查找的起始位置
  933. ++__first1;//确定正确查找起始位置
  934. }
  935. }
  936. }
  937. }
  938. //版本二:指定规则
  939. template <class _ForwardIter1, class _ForwardIter2,
  940. class _BinaryPredicate>
  941. _ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
  942. _ForwardIter2 __first2, _ForwardIter2 __last2,
  943. forward_iterator_tag, forward_iterator_tag,
  944. _BinaryPredicate __comp)
  945. {
  946. if (__first2 == __last2)
  947. return __last1;
  948. else {
  949. _ForwardIter1 __result = __last1;
  950. while (1) {
  951. _ForwardIter1 __new_result
  952. = search(__first1, __last1, __first2, __last2, __comp);
  953. if (__new_result == __last1)
  954. return __result;
  955. else {
  956. __result = __new_result;
  957. __first1 = __new_result;
  958. ++__first1;
  959. }
  960. }
  961. }
  962. }
  963. // find_end for bidirectional iterators. Requires partial specialization.
  964. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  965. //若萃取出来的迭代器类型为双向迭代器bidirectional_iterator_tag,则调用此函数
  966. template <class _BidirectionalIter1, class _BidirectionalIter2>
  967. _BidirectionalIter1
  968. __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
  969. _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
  970. bidirectional_iterator_tag, bidirectional_iterator_tag)
  971. {
  972. __STL_REQUIRES(_BidirectionalIter1, _BidirectionalIterator);
  973. __STL_REQUIRES(_BidirectionalIter2, _BidirectionalIterator);
  974. //利用反向迭代器很快就可以找到
  975. typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
  976. typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
  977. _RevIter1 __rlast1(__first1);
  978. _RevIter2 __rlast2(__first2);
  979. //查找时将序列一和序列二逆方向
  980. _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
  981. _RevIter2(__last2), __rlast2);
  982. if (__rresult == __rlast1)//表示没找到
  983. return __last1;
  984. else {//找到了
  985. _BidirectionalIter1 __result = __rresult.base();//转会正常迭代器
  986. advance(__result, -distance(__first2, __last2));//调整回到子序列的起始位置
  987. return __result;
  988. }
  989. }
  990. //版本二:指定规则comp
  991. template <class _BidirectionalIter1, class _BidirectionalIter2,
  992. class _BinaryPredicate>
  993. _BidirectionalIter1
  994. __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
  995. _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
  996. bidirectional_iterator_tag, bidirectional_iterator_tag,
  997. _BinaryPredicate __comp)
  998. {
  999. __STL_REQUIRES(_BidirectionalIter1, _BidirectionalIterator);
  1000. __STL_REQUIRES(_BidirectionalIter2, _BidirectionalIterator);
  1001. typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
  1002. typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
  1003. _RevIter1 __rlast1(__first1);
  1004. _RevIter2 __rlast2(__first2);
  1005. _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
  1006. _RevIter2(__last2), __rlast2,
  1007. __comp);
  1008. if (__rresult == __rlast1)
  1009. return __last1;
  1010. else {
  1011. _BidirectionalIter1 __result = __rresult.base();
  1012. advance(__result, -distance(__first2, __last2));
  1013. return __result;
  1014. }
  1015. }
  1016. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  1017. // Dispatching functions for find_end.
  1018. //find_end函数有两个版本:
  1019. //版本一:提供默认的equality操作operator==
  1020. //版本二:提供用户自行指定的操作规则comp
  1021. //注意:这里也有偏特化的知识
  1022. /*函数功能:Searches the range [first1,last1) for the last occurrence of the sequence defined by [first2,last2),
  1023. and returns an iterator to its first element, or last1 if no occurrences are found.
  1024. 函数原型:
  1025. equality (1):版本一
  1026. template <class ForwardIterator1, class ForwardIterator2>
  1027. ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1,
  1028. ForwardIterator2 first2, ForwardIterator2 last2);
  1029. predicate (2):版本二
  1030. template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
  1031. ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1,
  1032. ForwardIterator2 first2, ForwardIterator2 last2,
  1033. BinaryPredicate pred);
  1034. */
  1035. //对外接口的版本一
  1036. template <class _ForwardIter1, class _ForwardIter2>
  1037. inline _ForwardIter1
  1038. find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
  1039. _ForwardIter2 __first2, _ForwardIter2 __last2)
  1040. {
  1041. __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
  1042. __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
  1043. __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
  1044. typename iterator_traits<_ForwardIter1>::value_type,
  1045. typename iterator_traits<_ForwardIter2>::value_type);
  1046. //首先通过iterator_traits萃取出first1和first2的迭代器类型
  1047. //根据不同的迭代器类型调用不同的函数
  1048. return __find_end(__first1, __last1, __first2, __last2,
  1049. __ITERATOR_CATEGORY(__first1),
  1050. __ITERATOR_CATEGORY(__first2));
  1051. }
  1052. //对外接口的版本一
  1053. template <class _ForwardIter1, class _ForwardIter2,
  1054. class _BinaryPredicate>
  1055. inline _ForwardIter1
  1056. find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
  1057. _ForwardIter2 __first2, _ForwardIter2 __last2,
  1058. _BinaryPredicate __comp)
  1059. {
  1060. __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
  1061. __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
  1062. __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
  1063. typename iterator_traits<_ForwardIter1>::value_type,
  1064. typename iterator_traits<_ForwardIter2>::value_type);
  1065. //首先通过iterator_traits萃取出first1和first2的迭代器类型
  1066. //根据不同的迭代器类型调用不同的函数
  1067. return __find_end(__first1, __last1, __first2, __last2,
  1068. __ITERATOR_CATEGORY(__first1),
  1069. __ITERATOR_CATEGORY(__first2),
  1070. __comp);
  1071. }
  1072. //find_end函数举例:
  1073. /*
  1074. #include <iostream> // std::cout
  1075. #include <algorithm> // std::find_end
  1076. #include <vector> // std::vector
  1077. bool myfunction (int i, int j) {
  1078. return (i==j);
  1079. }
  1080. int main () {
  1081. int myints[] = {1,2,3,4,5,1,2,3,4,5};
  1082. std::vector<int> haystack (myints,myints+10);
  1083. int needle1[] = {1,2,3};
  1084. // using default comparison:
  1085. std::vector<int>::iterator it;
  1086. it = std::find_end (haystack.begin(), haystack.end(), needle1, needle1+3);
  1087. if (it!=haystack.end())
  1088. std::cout << "needle1 last found at position " << (it-haystack.begin()) << '\n';
  1089. int needle2[] = {4,5,1};
  1090. // using predicate comparison:
  1091. it = std::find_end (haystack.begin(), haystack.end(), needle2, needle2+3, myfunction);
  1092. if (it!=haystack.end())
  1093. std::cout << "needle2 last found at position " << (it-haystack.begin()) << '\n';
  1094. return 0;
  1095. }
  1096. Output:
  1097. needle1 found at position 5
  1098. needle2 found at position 3
  1099. */

参考资料:

《STL源码剖析》侯捷

发表评论

表情:
评论列表 (有 0 条评论,328人围观)

还没有评论,来说两句吧...

相关阅读

    相关 STL剖析】Sort算法

    前言:sort算法必须拿出来单独将,因为它是STL所有算法中最复杂最庞大的一个,就像我肯定会把copy算法单独列出来一样,这两个算法太重要了。 提示:STL算法特点是,前两个