1. stl_iterator.h
  2. // Filename: stl_iterator.h
  3.  
  4. // Comment By: 凝霜
  5. // E-mail: mdl2009@vip.qq.com
  6. // Blog: http://blog.csdn.net/mdl13412
  7.  
  8. /*
  9. *
  10. * Copyright (c) 1994
  11. * Hewlett-Packard Company
  12. *
  13. * Permission to use, copy, modify, distribute and sell this software
  14. * and its documentation for any purpose is hereby granted without fee,
  15. * provided that the above copyright notice appear in all copies and
  16. * that both that copyright notice and this permission notice appear
  17. * in supporting documentation. Hewlett-Packard Company makes no
  18. * representations about the suitability of this software for any
  19. * purpose. It is provided "as is" without express or implied warranty.
  20. *
  21. *
  22. * Copyright (c) 1996,1997
  23. * Silicon Graphics Computer Systems, Inc.
  24. *
  25. * Permission to use, copy, modify, distribute and sell this software
  26. * and its documentation for any purpose is hereby granted without fee,
  27. * provided that the above copyright notice appear in all copies and
  28. * that both that copyright notice and this permission notice appear
  29. * in supporting documentation. Silicon Graphics makes no
  30. * representations about the suitability of this software for any
  31. * purpose. It is provided "as is" without express or implied warranty.
  32. */
  33.  
  34. /* NOTE: This is an internal header file, included by other STL headers.
  35. * You should not attempt to use it directly.
  36. */
  37.  
  38. #ifndef __SGI_STL_INTERNAL_ITERATOR_H
  39. #define __SGI_STL_INTERNAL_ITERATOR_H
  40.  
  41. __STL_BEGIN_NAMESPACE
  42.  
  43. ////////////////////////////////////////////////////////////////////////////////
  44. // STL迭代器定义
  45. ////////////////////////////////////////////////////////////////////////////////
  46. // STL中有五种迭代器类型
  47. // Input Iterator read only
  48. // Output Iterator write only
  49. // Forward Iterator 允许"写入型"算法在其指向区间进行操作
  50. // Bidirectional Iterator 提供双向访问能力
  51. // Random Access Iterator 支持原生指针具有的全部能力
  52. ////////////////////////////////////////////////////////////////////////////////
  53. // 类型从属关系, 子类适用于接受父类类型的算法, 但是效率可能不佳
  54. //
  55. // Input Iterator
  56. // ↑
  57. // Forward Iterator
  58. // ↑
  59. // Bidirectional Iterator
  60. // ↑
  61. // Random Access Iterator
  62. ////////////////////////////////////////////////////////////////////////////////
  63.  
  64. // 用于标记迭代器类型
  65. struct input_iterator_tag {};
  66. struct output_iterator_tag {};
  67. struct forward_iterator_tag : public input_iterator_tag {};
  68. struct bidirectional_iterator_tag : public forward_iterator_tag {};
  69. struct random_access_iterator_tag : public bidirectional_iterator_tag {};
  70.  
  71. template <class T, class Distance> struct input_iterator
  72. {
  73. typedef input_iterator_tag iterator_category;
  74. typedef T value_type;
  75. typedef Distance difference_type;
  76. typedef T* pointer;
  77. typedef T& reference;
  78. };
  79.  
  80. struct output_iterator
  81. {
  82. typedef output_iterator_tag iterator_category;
  83. typedef void value_type;
  84. typedef void difference_type;
  85. typedef void pointer;
  86. typedef void reference;
  87. };
  88.  
  89. template <class T, class Distance> struct forward_iterator
  90. {
  91. typedef forward_iterator_tag iterator_category;
  92. typedef T value_type;
  93. typedef Distance difference_type;
  94. typedef T* pointer;
  95. typedef T& reference;
  96. };
  97.  
  98. template <class T, class Distance> struct bidirectional_iterator
  99. {
  100. typedef bidirectional_iterator_tag iterator_category;
  101. typedef T value_type;
  102. typedef Distance difference_type;
  103. typedef T* pointer;
  104. typedef T& reference;
  105. };
  106.  
  107. template <class T, class Distance> struct random_access_iterator
  108. {
  109. typedef random_access_iterator_tag iterator_category;
  110. typedef T value_type;
  111. typedef Distance difference_type;
  112. typedef T* pointer;
  113. typedef T& reference;
  114. };
  115.  
  116. #ifdef __STL_USE_NAMESPACES
  117. template <class Category, class T, class Distance = ptrdiff_t,
  118. class Pointer = T*, class Reference = T&>
  119. struct iterator {
  120. typedef Category iterator_category;
  121. typedef T value_type;
  122. typedef Distance difference_type;
  123. typedef Pointer pointer;
  124. typedef Reference reference;
  125. };
  126. #endif /* __STL_USE_NAMESPACES */
  127.  
  128. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  129.  
  130. ////////////////////////////////////////////////////////////////////////////////
  131. // iterator_traits定义
  132. ////////////////////////////////////////////////////////////////////////////////
  133.  
  134. // 用于traits出迭代其所指对象的型别
  135. template <class Iterator>
  136. struct iterator_traits
  137. {
  138. // 迭代器类型, STL提供五种迭代器
  139. typedef typename Iterator::iterator_category iterator_category;
  140.  
  141. // 迭代器所指对象的型别
  142. // 如果想与STL算法兼容, 那么在类内需要提供value_type定义
  143. typedef typename Iterator::value_type value_type;
  144.  
  145. // 这个是用于处理两个迭代器间距离的类型
  146. typedef typename Iterator::difference_type difference_type;
  147.  
  148. // 直接指向对象的原生指针类型
  149. typedef typename Iterator::pointer pointer;
  150.  
  151. // 这个是对象的引用类型
  152. typedef typename Iterator::reference reference;
  153. };
  154.  
  155. // 针对指针提供特化版本
  156. template <class T>
  157. struct iterator_traits<T*>
  158. {
  159. typedef random_access_iterator_tag iterator_category;
  160. typedef T value_type;
  161. typedef ptrdiff_t difference_type;
  162. typedef T* pointer;
  163. typedef T& reference;
  164. };
  165.  
  166. // 针对指向常对象的指针提供特化
  167. template <class T>
  168. struct iterator_traits<const T*>
  169. {
  170. typedef random_access_iterator_tag iterator_category;
  171. typedef T value_type;
  172. typedef ptrdiff_t difference_type;
  173. typedef const T* pointer;
  174. typedef const T& reference;
  175. };
  176.  
  177. ////////////////////////////////////////////////////////////////////////////////
  178. // iterator_traits支持函数
  179. ////////////////////////////////////////////////////////////////////////////////
  180. // iterator_category(const Iterator&) 返回迭代器类别
  181. // distance_type(const Iterator&) 返回表示迭代器距离的类型
  182. // value_type(const Iterator&) 返回迭代器所指对象的类型
  183. ////////////////////////////////////////////////////////////////////////////////
  184.  
  185. template <class Iterator>
  186. inline typename iterator_traits<Iterator>::iterator_category
  187. iterator_category(const Iterator&)
  188. {
  189. typedef typename iterator_traits<Iterator>::iterator_category category;
  190. return category();
  191. }
  192.  
  193. template <class Iterator>
  194. inline typename iterator_traits<Iterator>::difference_type*
  195. distance_type(const Iterator&)
  196. {
  197. return static_cast<typename iterator_traits<Iterator>::difference_type*>();
  198. }
  199.  
  200. template <class Iterator>
  201. inline typename iterator_traits<Iterator>::value_type*
  202. value_type(const Iterator&)
  203. {
  204. return static_cast<typename iterator_traits<Iterator>::value_type*>();
  205. }
  206.  
  207. #else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  208.  
  209. // 编译器不支持partial specialization of class templates(模板类偏特化)
  210. // 需要对所有迭代器类型都提供定义
  211.  
  212. template <class T, class Distance>
  213. inline input_iterator_tag
  214. iterator_category(const input_iterator<T, Distance>&)
  215. {
  216. return input_iterator_tag();
  217. }
  218.  
  219. inline output_iterator_tag iterator_category(const output_iterator&)
  220. {
  221. return output_iterator_tag();
  222. }
  223.  
  224. template <class T, class Distance>
  225. inline forward_iterator_tag
  226. iterator_category(const forward_iterator<T, Distance>&)
  227. {
  228. return forward_iterator_tag();
  229. }
  230.  
  231. template <class T, class Distance>
  232. inline bidirectional_iterator_tag
  233. iterator_category(const bidirectional_iterator<T, Distance>&)
  234. {
  235. return bidirectional_iterator_tag();
  236. }
  237.  
  238. template <class T, class Distance>
  239. inline random_access_iterator_tag
  240. iterator_category(const random_access_iterator<T, Distance>&)
  241. {
  242. return random_access_iterator_tag();
  243. }
  244.  
  245. template <class T>
  246. inline random_access_iterator_tag iterator_category(const T*)
  247. {
  248. return random_access_iterator_tag();
  249. }
  250.  
  251. template <class T, class Distance>
  252. inline T* value_type(const input_iterator<T, Distance>&)
  253. {
  254. return (T*)();
  255. }
  256.  
  257. template <class T, class Distance>
  258. inline T* value_type(const forward_iterator<T, Distance>&)
  259. {
  260. return (T*)();
  261. }
  262.  
  263. template <class T, class Distance>
  264. inline T* value_type(const bidirectional_iterator<T, Distance>&)
  265. {
  266. return (T*)();
  267. }
  268.  
  269. template <class T, class Distance>
  270. inline T* value_type(const random_access_iterator<T, Distance>&)
  271. {
  272. return (T*)();
  273. }
  274.  
  275. template <class T>
  276. inline T* value_type(const T*) { return (T*)(); }
  277.  
  278. template <class T, class Distance>
  279. inline Distance* distance_type(const input_iterator<T, Distance>&)
  280. {
  281. return (Distance*)();
  282. }
  283.  
  284. template <class T, class Distance>
  285. inline Distance* distance_type(const forward_iterator<T, Distance>&)
  286. {
  287. return (Distance*)();
  288. }
  289.  
  290. template <class T, class Distance>
  291. inline Distance*
  292. distance_type(const bidirectional_iterator<T, Distance>&)
  293. {
  294. return (Distance*)();
  295. }
  296.  
  297. template <class T, class Distance>
  298. inline Distance*
  299. distance_type(const random_access_iterator<T, Distance>&)
  300. {
  301. return (Distance*)();
  302. }
  303.  
  304. template <class T>
  305. inline ptrdiff_t* distance_type(const T*) { return (ptrdiff_t*)(); }
  306.  
  307. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  308.  
  309. ////////////////////////////////////////////////////////////////////////////////
  310. // template <class InputIterator, class Distance>
  311. // inline void distance(InputIterator first, InputIterator last, Distance& n)
  312. ////////////////////////////////////////////////////////////////////////////////
  313. // distance
  314. // |
  315. // |---------------- 判断迭代器类型
  316. // Input Iterator ↓ Random Access Iterator
  317. // -------------------------------------------
  318. // | |
  319. // | |
  320. // ↓ |
  321. // __distance(..., input_iterator_tag) |
  322. // while (first != last) { ++first; ++n; } |
  323. // ↓
  324. // __distance(..., random_access_iterator_tag)
  325. // n += last - first;
  326. ////////////////////////////////////////////////////////////////////////////////
  327.  
  328. template <class InputIterator, class Distance>
  329. inline void __distance(InputIterator first, InputIterator last, Distance& n,
  330. input_iterator_tag)
  331. {
  332. while (first != last) { ++first; ++n; }
  333. }
  334.  
  335. template <class RandomAccessIterator, class Distance>
  336. inline void __distance(RandomAccessIterator first, RandomAccessIterator last,
  337. Distance& n, random_access_iterator_tag)
  338. {
  339. n += last - first;
  340. }
  341.  
  342. template <class InputIterator, class Distance>
  343. inline void distance(InputIterator first, InputIterator last, Distance& n)
  344. {
  345. __distance(first, last, n, iterator_category(first));
  346. }
  347.  
  348. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  349.  
  350. ////////////////////////////////////////////////////////////////////////////////
  351. // template <class InputIterator>
  352. // inline iterator_traits<InputIterator>::difference_type
  353. // distance(InputIterator first, InputIterator last)
  354. ////////////////////////////////////////////////////////////////////////////////
  355. // distance
  356. // |
  357. // |---------------- 判断迭代器类型
  358. // Input Iterator ↓ Random Access Iterator
  359. // -------------------------------------------
  360. // | |
  361. // | |
  362. // ↓ |
  363. // __distance(..., input_iterator_tag) |
  364. // while (first != last) { |
  365. // ++first; ++n; |
  366. // } |
  367. // return n; |
  368. // ↓
  369. // __distance(..., random_access_iterator_tag)
  370. // return last - first;
  371. ////////////////////////////////////////////////////////////////////////////////
  372.  
  373. template <class InputIterator>
  374. inline iterator_traits<InputIterator>::difference_type
  375. __distance(InputIterator first, InputIterator last, input_iterator_tag)
  376. {
  377. iterator_traits<InputIterator>::difference_type n = ;
  378. while (first != last) {
  379. ++first; ++n;
  380. }
  381. return n;
  382. }
  383.  
  384. template <class RandomAccessIterator>
  385. inline iterator_traits<RandomAccessIterator>::difference_type
  386. __distance(RandomAccessIterator first, RandomAccessIterator last,
  387. random_access_iterator_tag)
  388. {
  389. return last - first;
  390. }
  391.  
  392. template <class InputIterator>
  393. inline iterator_traits<InputIterator>::difference_type
  394. distance(InputIterator first, InputIterator last)
  395. {
  396. typedef typename iterator_traits<InputIterator>::iterator_category category;
  397. return __distance(first, last, category());
  398. }
  399.  
  400. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  401.  
  402. ////////////////////////////////////////////////////////////////////////////////
  403. // advance()实现部分
  404. ////////////////////////////////////////////////////////////////////////////////
  405. // advance
  406. // |
  407. // |---------------- 判断迭代器类型
  408. // Input Iterator ↓
  409. // ---------------------------------------------------------------------
  410. // | Random Access Iterator | Bidirectional Iterator |
  411. // | | |
  412. // ↓ | |
  413. // __advance(..., input_iterator_tag) | |
  414. // while (n--) ++i; | |
  415. // | |
  416. // ↓ |
  417. // __advance(..., random_access_iterator_tag) |
  418. // i += n; |
  419. // |
  420. // ↓
  421. // __advance(..., bidirectional_iterator_tag)
  422. // if (n >= 0)
  423. // while (n--) ++i;
  424. // else
  425. // while (n++) --i;
  426. ////////////////////////////////////////////////////////////////////////////////
  427.  
  428. template <class InputIterator, class Distance>
  429. inline void __advance(InputIterator& i, Distance n, input_iterator_tag)
  430. {
  431. while (n--) ++i;
  432. }
  433.  
  434. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  435. #pragma set woff 1183
  436. #endif
  437.  
  438. template <class BidirectionalIterator, class Distance>
  439. inline void __advance(BidirectionalIterator& i, Distance n,
  440. bidirectional_iterator_tag)
  441. {
  442. if (n >= )
  443. while (n--) ++i;
  444. else
  445. while (n++) --i;
  446. }
  447.  
  448. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  449. #pragma reset woff 1183
  450. #endif
  451.  
  452. template <class RandomAccessIterator, class Distance>
  453. inline void __advance(RandomAccessIterator& i, Distance n,
  454. random_access_iterator_tag)
  455. {
  456. i += n;
  457. }
  458.  
  459. template <class InputIterator, class Distance>
  460. inline void advance(InputIterator& i, Distance n)
  461. {
  462. __advance(i, n, iterator_category(i));
  463. }
  464.  
  465. ////////////////////////////////////////////////////////////////////////////////
  466. // back_insert_iterator实现部分
  467. ////////////////////////////////////////////////////////////////////////////////
  468.  
  469. template <class Container>
  470. class back_insert_iterator
  471. {
  472. protected:
  473. Container* container;
  474. public:
  475. typedef output_iterator_tag iterator_category;
  476. typedef void value_type;
  477. typedef void difference_type;
  478. typedef void pointer;
  479. typedef void reference;
  480.  
  481. explicit back_insert_iterator(Container& x) : container(&x) {}
  482.  
  483. // 只有提供了push_back()操作的容器才能使用back_insert_iterator
  484. back_insert_iterator<Container>&
  485. operator=(const typename Container::value_type& value)
  486. {
  487. container->push_back(value);
  488. return *this;
  489. }
  490.  
  491. back_insert_iterator<Container>& operator*() { return *this; }
  492. back_insert_iterator<Container>& operator++() { return *this; }
  493. back_insert_iterator<Container>& operator++(int) { return *this; }
  494. };
  495.  
  496. #ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
  497.  
  498. // 用于traits出back_insert_iterator的迭代器类别
  499. template <class Container>
  500. inline output_iterator_tag
  501. iterator_category(const back_insert_iterator<Container>&)
  502. {
  503. return output_iterator_tag();
  504. }
  505.  
  506. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  507.  
  508. template <class Container>
  509. inline back_insert_iterator<Container> back_inserter(Container& x)
  510. {
  511. return back_insert_iterator<Container>(x);
  512. }
  513.  
  514. ////////////////////////////////////////////////////////////////////////////////
  515. // front_insert_iterator实现部分
  516. ////////////////////////////////////////////////////////////////////////////////
  517.  
  518. template <class Container>
  519. class front_insert_iterator
  520. {
  521. protected:
  522. Container* container;
  523. public:
  524. typedef output_iterator_tag iterator_category;
  525. typedef void value_type;
  526. typedef void difference_type;
  527. typedef void pointer;
  528. typedef void reference;
  529.  
  530. explicit front_insert_iterator(Container& x) : container(&x) {}
  531.  
  532. // 只有提供了push_front()操作的容器才能使用front_insert_iterator
  533. front_insert_iterator<Container>&
  534. operator=(const typename Container::value_type& value)
  535. {
  536. container->push_front(value);
  537. return *this;
  538. }
  539. front_insert_iterator<Container>& operator*() { return *this; }
  540. front_insert_iterator<Container>& operator++() { return *this; }
  541. front_insert_iterator<Container>& operator++(int) { return *this; }
  542. };
  543.  
  544. #ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
  545.  
  546. template <class Container>
  547. inline output_iterator_tag
  548. iterator_category(const front_insert_iterator<Container>&)
  549. {
  550. return output_iterator_tag();
  551. }
  552.  
  553. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  554.  
  555. template <class Container>
  556. inline front_insert_iterator<Container> front_inserter(Container& x)
  557. {
  558. return front_insert_iterator<Container>(x);
  559. }
  560.  
  561. ////////////////////////////////////////////////////////////////////////////////
  562. // insert_iterator实现部分
  563. ////////////////////////////////////////////////////////////////////////////////
  564.  
  565. template <class Container>
  566. class insert_iterator
  567. {
  568. protected:
  569. Container* container;
  570. typename Container::iterator iter;
  571. public:
  572. typedef output_iterator_tag iterator_category;
  573. typedef void value_type;
  574. typedef void difference_type;
  575. typedef void pointer;
  576. typedef void reference;
  577.  
  578. insert_iterator(Container& x, typename Container::iterator i)
  579. : container(&x), iter(i) {}
  580.  
  581. // 只有提供了insert操作的容器才能使用insert_iterator
  582. insert_iterator<Container>&
  583. operator=(const typename Container::value_type& value)
  584. {
  585. iter = container->insert(iter, value);
  586. ++iter;
  587. return *this;
  588. }
  589. insert_iterator<Container>& operator*() { return *this; }
  590. insert_iterator<Container>& operator++() { return *this; }
  591. insert_iterator<Container>& operator++(int) { return *this; }
  592. };
  593.  
  594. #ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
  595.  
  596. template <class Container>
  597. inline output_iterator_tag
  598. iterator_category(const insert_iterator<Container>&)
  599. {
  600. return output_iterator_tag();
  601. }
  602.  
  603. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  604.  
  605. template <class Container, class Iterator>
  606. inline insert_iterator<Container> inserter(Container& x, Iterator i)
  607. {
  608. typedef typename Container::iterator iter;
  609. return insert_iterator<Container>(x, iter(i));
  610. }
  611.  
  612. ////////////////////////////////////////////////////////////////////////////////
  613. // reverse_bidirectional_iterator实现部分
  614. ////////////////////////////////////////////////////////////////////////////////
  615.  
  616. // reverse_bidirectional_iterator使用的是BidirectionalIterator
  617. // 所以要对operator *(), ++(), ++(int)都提供处理
  618. // 同时因为是反向迭代器, 所以重载运算符的操作要特殊处理
  619. #ifndef __STL_LIMITED_DEFAULT_TEMPLATES
  620. template <class BidirectionalIterator, class T, class Reference = T&,
  621. class Distance = ptrdiff_t>
  622. #else
  623. template <class BidirectionalIterator, class T, class Reference,
  624. class Distance>
  625. #endif
  626. class reverse_bidirectional_iterator
  627. {
  628. typedef reverse_bidirectional_iterator<BidirectionalIterator, T, Reference,
  629. Distance> self;
  630. protected:
  631. BidirectionalIterator current;
  632. public:
  633. typedef bidirectional_iterator_tag iterator_category;
  634. typedef T value_type;
  635. typedef Distance difference_type;
  636. typedef T* pointer;
  637. typedef Reference reference;
  638.  
  639. reverse_bidirectional_iterator() {}
  640. explicit reverse_bidirectional_iterator(BidirectionalIterator x)
  641. : current(x) {}
  642. BidirectionalIterator base() const { return current; }
  643. Reference operator*() const {
  644. BidirectionalIterator tmp = current;
  645. return *--tmp;
  646. }
  647. #ifndef __SGI_STL_NO_ARROW_OPERATOR
  648. pointer operator->() const { return &(operator*()); }
  649. #endif /* __SGI_STL_NO_ARROW_OPERATOR */
  650. self& operator++() {
  651. --current;
  652. return *this;
  653. }
  654. self operator++(int) {
  655. self tmp = *this;
  656. --current;
  657. return tmp;
  658. }
  659. self& operator--() {
  660. ++current;
  661. return *this;
  662. }
  663. self operator--(int) {
  664. self tmp = *this;
  665. ++current;
  666. return tmp;
  667. }
  668. };
  669.  
  670. #ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
  671.  
  672. template <class BidirectionalIterator, class T, class Reference,
  673. class Distance>
  674. inline bidirectional_iterator_tag
  675. iterator_category(const reverse_bidirectional_iterator<BidirectionalIterator,
  676. T,
  677. Reference, Distance>&)
  678. {
  679. return bidirectional_iterator_tag();
  680. }
  681.  
  682. template <class BidirectionalIterator, class T, class Reference,
  683. class Distance>
  684. inline T*
  685. value_type(const reverse_bidirectional_iterator<BidirectionalIterator, T,
  686. Reference, Distance>&)
  687. {
  688. return (T*) ;
  689. }
  690.  
  691. template <class BidirectionalIterator, class T, class Reference,
  692. class Distance>
  693. inline Distance*
  694. distance_type(const reverse_bidirectional_iterator<BidirectionalIterator, T,
  695. Reference, Distance>&)
  696. {
  697. return (Distance*) ;
  698. }
  699.  
  700. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  701.  
  702. template <class BidirectionalIterator, class T, class Reference,
  703. class Distance>
  704. inline bool operator==(
  705. const reverse_bidirectional_iterator<BidirectionalIterator, T, Reference,
  706. Distance>& x,
  707. const reverse_bidirectional_iterator<BidirectionalIterator, T, Reference,
  708. Distance>& y)
  709. {
  710. return x.base() == y.base();
  711. }
  712.  
  713. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  714.  
  715. ////////////////////////////////////////////////////////////////////////////////
  716. // reverse_iterator实现部分
  717. ////////////////////////////////////////////////////////////////////////////////
  718.  
  719. // This is the new version of reverse_iterator, as defined in the
  720. // draft C++ standard. It relies on the iterator_traits template,
  721. // which in turn relies on partial specialization. The class
  722. // reverse_bidirectional_iterator is no longer part of the draft
  723. // standard, but it is retained for backward compatibility.
  724.  
  725. template <class Iterator>
  726. class reverse_iterator
  727. {
  728. protected:
  729. Iterator current;
  730. public:
  731. typedef typename iterator_traits<Iterator>::iterator_category
  732. iterator_category;
  733. typedef typename iterator_traits<Iterator>::value_type
  734. value_type;
  735. typedef typename iterator_traits<Iterator>::difference_type
  736. difference_type;
  737. typedef typename iterator_traits<Iterator>::pointer
  738. pointer;
  739. typedef typename iterator_traits<Iterator>::reference
  740. reference;
  741.  
  742. typedef Iterator iterator_type;
  743. typedef reverse_iterator<Iterator> self;
  744.  
  745. public:
  746. reverse_iterator() {}
  747. explicit reverse_iterator(iterator_type x) : current(x) {}
  748.  
  749. reverse_iterator(const self& x) : current(x.current) {}
  750. #ifdef __STL_MEMBER_TEMPLATES
  751. template <class Iter>
  752. reverse_iterator(const reverse_iterator<Iter>& x) : current(x.current) {}
  753. #endif /* __STL_MEMBER_TEMPLATES */
  754.  
  755. iterator_type base() const { return current; }
  756. reference operator*() const {
  757. Iterator tmp = current;
  758. return *--tmp;
  759. }
  760. #ifndef __SGI_STL_NO_ARROW_OPERATOR
  761. pointer operator->() const { return &(operator*()); }
  762. #endif /* __SGI_STL_NO_ARROW_OPERATOR */
  763.  
  764. self& operator++() {
  765. --current;
  766. return *this;
  767. }
  768. self operator++(int) {
  769. self tmp = *this;
  770. --current;
  771. return tmp;
  772. }
  773. self& operator--() {
  774. ++current;
  775. return *this;
  776. }
  777. self operator--(int) {
  778. self tmp = *this;
  779. ++current;
  780. return tmp;
  781. }
  782.  
  783. self operator+(difference_type n) const {
  784. return self(current - n);
  785. }
  786. self& operator+=(difference_type n) {
  787. current -= n;
  788. return *this;
  789. }
  790. self operator-(difference_type n) const {
  791. return self(current + n);
  792. }
  793. self& operator-=(difference_type n) {
  794. current += n;
  795. return *this;
  796. }
  797. reference operator[](difference_type n) const { return *(*this + n); }
  798. };
  799.  
  800. template <class Iterator>
  801. inline bool operator==(const reverse_iterator<Iterator>& x,
  802. const reverse_iterator<Iterator>& y)
  803. {
  804. return x.base() == y.base();
  805. }
  806.  
  807. template <class Iterator>
  808. inline bool operator<(const reverse_iterator<Iterator>& x,
  809. const reverse_iterator<Iterator>& y)
  810. {
  811. return y.base() < x.base();
  812. }
  813.  
  814. template <class Iterator>
  815. inline typename reverse_iterator<Iterator>::difference_type
  816. operator-(const reverse_iterator<Iterator>& x,
  817. const reverse_iterator<Iterator>& y)
  818. {
  819. return y.base() - x.base();
  820. }
  821.  
  822. template <class Iterator>
  823. inline reverse_iterator<Iterator>
  824. operator+(reverse_iterator<Iterator>::difference_type n,
  825. const reverse_iterator<Iterator>& x)
  826. {
  827. return reverse_iterator<Iterator>(x.base() - n);
  828. }
  829.  
  830. #else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  831.  
  832. // 如果不支持partial specialization of class templates(模板类偏特化)
  833. // 则使用HP STL的实现
  834.  
  835. // This is the old version of reverse_iterator, as found in the original
  836. // HP STL. It does not use partial specialization.
  837.  
  838. #ifndef __STL_LIMITED_DEFAULT_TEMPLATES
  839. template <class RandomAccessIterator, class T, class Reference = T&,
  840. class Distance = ptrdiff_t>
  841. #else
  842. template <class RandomAccessIterator, class T, class Reference,
  843. class Distance>
  844. #endif
  845. class reverse_iterator
  846. {
  847. typedef reverse_iterator<RandomAccessIterator, T, Reference, Distance>
  848. self;
  849. protected:
  850. RandomAccessIterator current;
  851. public:
  852. typedef random_access_iterator_tag iterator_category;
  853. typedef T value_type;
  854. typedef Distance difference_type;
  855. typedef T* pointer;
  856. typedef Reference reference;
  857.  
  858. reverse_iterator() {}
  859. explicit reverse_iterator(RandomAccessIterator x) : current(x) {}
  860. RandomAccessIterator base() const { return current; }
  861. Reference operator*() const { return *(current - ); }
  862. #ifndef __SGI_STL_NO_ARROW_OPERATOR
  863. pointer operator->() const { return &(operator*()); }
  864. #endif /* __SGI_STL_NO_ARROW_OPERATOR */
  865. self& operator++() {
  866. --current;
  867. return *this;
  868. }
  869. self operator++(int) {
  870. self tmp = *this;
  871. --current;
  872. return tmp;
  873. }
  874. self& operator--() {
  875. ++current;
  876. return *this;
  877. }
  878. self operator--(int) {
  879. self tmp = *this;
  880. ++current;
  881. return tmp;
  882. }
  883. self operator+(Distance n) const {
  884. return self(current - n);
  885. }
  886. self& operator+=(Distance n) {
  887. current -= n;
  888. return *this;
  889. }
  890. self operator-(Distance n) const {
  891. return self(current + n);
  892. }
  893. self& operator-=(Distance n) {
  894. current += n;
  895. return *this;
  896. }
  897. Reference operator[](Distance n) const { return *(*this + n); }
  898. };
  899.  
  900. template <class RandomAccessIterator, class T, class Reference, class Distance>
  901. inline random_access_iterator_tag
  902. iterator_category(const reverse_iterator<RandomAccessIterator, T,
  903. Reference, Distance>&)
  904. {
  905. return random_access_iterator_tag();
  906. }
  907.  
  908. template <class RandomAccessIterator, class T, class Reference, class Distance>
  909. inline T* value_type(const reverse_iterator<RandomAccessIterator, T,
  910. Reference, Distance>&)
  911. {
  912. return (T*) ;
  913. }
  914.  
  915. template <class RandomAccessIterator, class T, class Reference, class Distance>
  916. inline Distance* distance_type(const reverse_iterator<RandomAccessIterator, T,
  917. Reference, Distance>&)
  918. {
  919. return (Distance*) ;
  920. }
  921.  
  922. template <class RandomAccessIterator, class T, class Reference, class Distance>
  923. inline bool operator==(const reverse_iterator<RandomAccessIterator, T,
  924. Reference, Distance>& x,
  925. const reverse_iterator<RandomAccessIterator, T,
  926. Reference, Distance>& y)
  927. {
  928. return x.base() == y.base();
  929. }
  930.  
  931. template <class RandomAccessIterator, class T, class Reference, class Distance>
  932. inline bool operator<(const reverse_iterator<RandomAccessIterator, T,
  933. Reference, Distance>& x,
  934. const reverse_iterator<RandomAccessIterator, T,
  935. Reference, Distance>& y)
  936. {
  937. return y.base() < x.base();
  938. }
  939.  
  940. template <class RandomAccessIterator, class T, class Reference, class Distance>
  941. inline Distance operator-(const reverse_iterator<RandomAccessIterator, T,
  942. Reference, Distance>& x,
  943. const reverse_iterator<RandomAccessIterator, T,
  944. Reference, Distance>& y)
  945. {
  946. return y.base() - x.base();
  947. }
  948.  
  949. template <class RandomAccessIter, class T, class Ref, class Dist>
  950. inline reverse_iterator<RandomAccessIter, T, Ref, Dist>
  951. operator+(Dist n, const reverse_iterator<RandomAccessIter, T, Ref, Dist>& x)
  952. {
  953. return reverse_iterator<RandomAccessIter, T, Ref, Dist>(x.base() - n);
  954. }
  955.  
  956. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  957.  
  958. ////////////////////////////////////////////////////////////////////////////////
  959. // istream_iterator实现部分
  960. ////////////////////////////////////////////////////////////////////////////////
  961.  
  962. template <class T, class Distance = ptrdiff_t>
  963. class istream_iterator
  964. {
  965. friend bool
  966. operator== __STL_NULL_TMPL_ARGS (const istream_iterator<T, Distance>& x,
  967. const istream_iterator<T, Distance>& y);
  968. protected:
  969. istream* stream;
  970. T value;
  971. bool end_marker;
  972. void read() {
  973. end_marker = (*stream) ? true : false;
  974. if (end_marker) *stream >> value;
  975. end_marker = (*stream) ? true : false;
  976. }
  977. public:
  978. typedef input_iterator_tag iterator_category;
  979. typedef T value_type;
  980. typedef Distance difference_type;
  981. typedef const T* pointer;
  982. typedef const T& reference;
  983.  
  984. istream_iterator() : stream(&cin), end_marker(false) {}
  985. istream_iterator(istream& s) : stream(&s) { read(); }
  986. reference operator*() const { return value; }
  987. #ifndef __SGI_STL_NO_ARROW_OPERATOR
  988. pointer operator->() const { return &(operator*()); }
  989. #endif /* __SGI_STL_NO_ARROW_OPERATOR */
  990. istream_iterator<T, Distance>& operator++() {
  991. read();
  992. return *this;
  993. }
  994. istream_iterator<T, Distance> operator++(int) {
  995. istream_iterator<T, Distance> tmp = *this;
  996. read();
  997. return tmp;
  998. }
  999. };
  1000.  
  1001. #ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
  1002.  
  1003. template <class T, class Distance>
  1004. inline input_iterator_tag
  1005. iterator_category(const istream_iterator<T, Distance>&)
  1006. {
  1007. return input_iterator_tag();
  1008. }
  1009.  
  1010. template <class T, class Distance>
  1011. inline T* value_type(const istream_iterator<T, Distance>&) { return (T*) ; }
  1012.  
  1013. template <class T, class Distance>
  1014. inline Distance* distance_type(const istream_iterator<T, Distance>&)
  1015. {
  1016. return (Distance*) ;
  1017. }
  1018.  
  1019. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  1020.  
  1021. template <class T, class Distance>
  1022. inline bool operator==(const istream_iterator<T, Distance>& x,
  1023. const istream_iterator<T, Distance>& y)
  1024. {
  1025. return x.stream == y.stream && x.end_marker == y.end_marker ||
  1026. x.end_marker == false && y.end_marker == false;
  1027. }
  1028.  
  1029. ////////////////////////////////////////////////////////////////////////////////
  1030. // ostream_iterator实现部分
  1031. ////////////////////////////////////////////////////////////////////////////////
  1032.  
  1033. template <class T>
  1034. class ostream_iterator
  1035. {
  1036. protected:
  1037. ostream* stream;
  1038. const char* string;
  1039. public:
  1040. typedef output_iterator_tag iterator_category;
  1041. typedef void value_type;
  1042. typedef void difference_type;
  1043. typedef void pointer;
  1044. typedef void reference;
  1045.  
  1046. ostream_iterator(ostream& s) : stream(&s), string() {}
  1047. ostream_iterator(ostream& s, const char* c) : stream(&s), string(c) {}
  1048. ostream_iterator<T>& operator=(const T& value) {
  1049. *stream << value;
  1050. if (string) *stream << string;
  1051. return *this;
  1052. }
  1053. ostream_iterator<T>& operator*() { return *this; }
  1054. ostream_iterator<T>& operator++() { return *this; }
  1055. ostream_iterator<T>& operator++(int) { return *this; }
  1056. };
  1057.  
  1058. #ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
  1059.  
  1060. template <class T>
  1061. inline output_iterator_tag
  1062. iterator_category(const ostream_iterator<T>&)
  1063. {
  1064. return output_iterator_tag();
  1065. }
  1066.  
  1067. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  1068.  
  1069. __STL_END_NAMESPACE
  1070.  
  1071. #endif /* __SGI_STL_INTERNAL_ITERATOR_H */
  1072.  
  1073. // Local Variables:
  1074. // mode:C++
  1075. // End:

stl_iterator.h的更多相关文章

  1. 《STL源代码分析》---stl_list.h读书笔记

    STL在列表list它是一种经常使用的容器.list不连续双向链表在内存,而且是环形. 理解列表如何操作的详细信息,然后.阅读STL名单上的代码是最好的方法. G++ 2.91.57.cygnus\c ...

  2. stl_algobase.h

    stl_algobase.h // Filename: stl_algobase.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: ...

  3. stl_list.h

    stl_list.h // Filename: stl_list.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http://b ...

  4. stl_slist.h

    stl_slist.h // Filename: stl_slist.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http:/ ...

  5. STL源代码剖析——基本算法stl_algobase.h

    前言 在STL中.算法是常常被使用的,算法在整个STL中起到很关键的数据.本节介绍的是一些基本算法,包括equal.fill.fill_n,iter_swap.lexicographical_comp ...

  6. Linux覆盖率一点研究:获取覆盖率数据

     首先,当然哥不介意你鄙视我在网上找的资料研究! 白盒覆盖率是啥东东这个问题大家自己查百度啦!我也不太懂,就知道它不是个东西,就这样开始吧(MT一般是先摸四蹄呢还是先黑金币呢?这是个问题)! 首先:l ...

  7. 【转】三十分钟掌握STL

    转自http://net.pku.edu.cn/~yhf/UsingSTL.htm 三十分钟掌握STL 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以 ...

  8. 三十分钟掌握STL

    这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以化了两个晚上把它翻译出来.我没有对翻译出来的内容校验过.如果你没法在三十分钟内觉得有所收获,那么赶紧扔了 ...

  9. 【转】三十分钟学会STL算法

    转载自: http://net.pku.edu.cn/~yhf/UsingSTL.htm 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以化了两个晚上把 ...

随机推荐

  1. 可执行jar包

    我已经解决了这个问题,在eclipse中有一个打包工具,可以将程序打包成.jar文件: 右键要打包的 project--->Export--->Java--->JAR file--- ...

  2. 基于react-native android的新闻app的开发

    使用平台:android 代码获取地址:https://github.com/wuwanyu/ReactNative-Android-MovieDemo 项目展示: 结构图: SpalashScree ...

  3. 计算CPU利用率

    一般来说对于需要大量cpu计算的进程,当前端压力越大时,CPU利用率越高.但对于I/O网络密集型的进程,即使请求很多,服务器的CPU也不一定很到,这时的服务瓶颈一般是在磁盘的I/O上.比较常见的就是, ...

  4. 解决ubuntu无法进入unity模式

    终端输入如下命令: 1.sudo add-apt-repository ppa:gnome3-team/gnome3 2.sudo apt-get update 3.sudo apt-get inst ...

  5. 笔试真题解析 ALBB-2015 算法project师实习生机试

    1.用十进制计算30!(30的阶乘),将结果转换成3进制进行表示的话,该进制下的结果末尾会有____个0. [解析] 计算N.下3进制结果末尾有多少个0,事实上就是计算3进制中的3被进位多少次,仅仅要 ...

  6. Hive高级

    HiveServer2 概述: https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Overview2 客户端: https:// ...

  7. android菜鸟学习笔记23----ContentProvider(三)利用内置ContentProvider监听短信及查看联系人

    要使用一个ContentProvider,必须要知道的是它所能匹配的Uri及其数据存储的表的结构. 首先想办法找到访问短信及联系人数据的ContentProvider能接受的Uri: 到github上 ...

  8. 【python】-- RabbitMQ RPC模型

    RabbitMQ RPC模型 RPC(remote procedure call)模型说通俗一点就是客户端发一个请求给远程服务端,让它去执行,然后服务端端再把执行的结果再返回给客户端. 1.服务端 i ...

  9. 学习Filter

    http://www.cnblogs.com/jbelial/archive/2012/07/09/2582638.html Filter 介绍: 它主要用于对用户请求进行预处理,也可以对HttpSe ...

  10. 从HttpServletRequest获取POST数据的代码

    我们经常需要从HttpServletRequest对象获取POST请求的数据,下面给出简练的代码共大家参考 StringBuffer jb = new StringBuffer(); String l ...