C++ Tutorial/STL Algorithms Modifying sequence operations/reverse copy

Материал из C\C++ эксперт
Перейти к: навигация, поиск

Copy elements in one vector into another vector in reverse order

<source lang="cpp">#include <iostream> using std::cout; using std::endl;

  1. include <algorithm>
  2. include <vector>
  3. include <iterator>

int main() {

  int a1[ 10 ] = { 1, 3, 5, 7, 9, 1, 3, 5, 7, 9 };
  std::vector< int > v1( a1, a1 + 10 ); // copy of a
  std::ostream_iterator< int > output( cout, " " );
  cout << "Vector v1 contains: ";
  std::copy( v1.begin(), v1.end(), output );
  std::vector< int > results2;
  std::reverse_copy( v1.begin(), v1.end(), std::back_inserter( results2 ) );
  cout << "\nAfter reverse_copy, results2 contains: ";
  std::copy( results2.begin(), results2.end(), output );
  cout << endl;
  return 0;

}</source>

Vector v1 contains: 1 3 5 7 9 1 3 5 7 9
After reverse_copy, results2 contains: 9 7 5 3 1 9 7 5 3 1

Use reverse_copy to print all of them in reverse order

<source lang="cpp">/* The following code example is taken from the book

* "The C++ Standard Library - A Tutorial and Reference"
* by Nicolai M. Josuttis, Addison-Wesley, 1999
*
* (C) Copyright Nicolai M. Josuttis 1999.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
  1. include <iostream>
  2. include <vector>
  3. include <deque>
  4. include <list>
  5. include <set>
  6. include <map>
  7. include <string>
  8. include <algorithm>
  9. include <iterator>
  10. include <functional>
  11. include <numeric>

/* PRINT_ELEMENTS()

* - prints optional C-string optcstr followed by
* - all elements of the collection coll
* - separated by spaces
*/

template <class T> inline void PRINT_ELEMENTS (const T& coll, const char* optcstr="") {

   typename T::const_iterator pos;
   std::cout << optcstr;
   for (pos=coll.begin(); pos!=coll.end(); ++pos) {
       std::cout << *pos << " ";
   }
   std::cout << std::endl;

} /* INSERT_ELEMENTS (collection, first, last)

* - fill values from first to last into the collection
* - NOTE: NO half-open range
*/

template <class T> inline void INSERT_ELEMENTS (T& coll, int first, int last) {

   for (int i=first; i<=last; ++i) {
       coll.insert(coll.end(),i);
   }

} using namespace std; int main() {

   vector<int> coll;
   INSERT_ELEMENTS(coll,1,9);
   PRINT_ELEMENTS(coll,"coll: ");
   // print all of them in reverse order
   reverse_copy (coll.begin(), coll.end(),           // source
                 ostream_iterator<int>(cout," "));   // destination
   cout << endl;

}</source>

coll: 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1

Using reverse_copy, a copying version of the generic reverse algorithm

<source lang="cpp">#include <iostream>

  1. include <algorithm>
  2. include <cassert>

using namespace std; int main() {

 int a[100], b[100];
 int i;
 for (i = 0; i < 100; ++i) 
   a[i] = i;
 reverse_copy(&a[0], &a[100], &b[0]);

 for (i = 0; i < 100; ++i) 
    cout << " a: "<< a[i] << "b: " <<  b[i] << " \n";
 return 0;

}</source>

a: 0b: 99
 a: 1b: 98
 a: 2b: 97
 a: 3b: 96
 a: 4b: 95
 a: 5b: 94
 a: 6b: 93
 a: 7b: 92
 a: 8b: 91
 a: 9b: 90
 a: 10b: 89
 a: 11b: 88
 a: 12b: 87
 a: 13b: 86
 a: 14b: 85
 a: 15b: 84
 a: 16b: 83
 a: 17b: 82
 a: 18b: 81
 a: 19b: 80
 a: 20b: 79
 a: 21b: 78
 a: 22b: 77
 a: 23b: 76
 a: 24b: 75
 a: 25b: 74
 a: 26b: 73
 a: 27b: 72
 a: 28b: 71
 a: 29b: 70
 a: 30b: 69
 a: 31b: 68
 a: 32b: 67
 a: 33b: 66
 a: 34b: 65
 a: 35b: 64
 a: 36b: 63
 a: 37b: 62
 a: 38b: 61
 a: 39b: 60
 a: 40b: 59
 a: 41b: 58
 a: 42b: 57
 a: 43b: 56
 a: 44b: 55
 a: 45b: 54
 a: 46b: 53
 a: 47b: 52
 a: 48b: 51
 a: 49b: 50
 a: 50b: 49
 a: 51b: 48
 a: 52b: 47
 a: 53b: 46
 a: 54b: 45
 a: 55b: 44
 a: 56b: 43
 a: 57b: 42
 a: 58b: 41
 a: 59b: 40
 a: 60b: 39
 a: 61b: 38
 a: 62b: 37
 a: 63b: 36
 a: 64b: 35
 a: 65b: 34
 a: 66b: 33
 a: 67b: 32
 a: 68b: 31
 a: 69b: 30
 a: 70b: 29
 a: 71b: 28
 a: 72b: 27
 a: 73b: 26
 a: 74b: 25
 a: 75b: 24
 a: 76b: 23
 a: 77b: 22
 a: 78b: 21
 a: 79b: 20
 a: 80b: 19
 a: 81b: 18
 a: 82b: 17
 a: 83b: 16
 a: 84b: 15
 a: 85b: 14
 a: 86b: 13
 a: 87b: 12
 a: 88b: 11
 a: 89b: 10
 a: 90b: 9
 a: 91b: 8
 a: 92b: 7
 a: 93b: 6
 a: 94b: 5
 a: 95b: 4
 a: 96b: 3
 a: 97b: 2
 a: 98b: 1
 a: 99b: 0