C++ Tutorial/STL Algorithms Modifying sequence operations/reverse copy
Версия от 14:21, 25 мая 2010; (обсуждение)
Copy elements in one vector into another vector in reverse order
#include <iostream>
using std::cout;
using std::endl;
#include <algorithm>
#include <vector>
#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;
}
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
/* 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.
*/
#include <iostream>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <iterator>
#include <functional>
#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;
}
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
#include <iostream>
#include <algorithm>
#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;
}
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