C++/STL Algorithms Modifying sequence operations/reverse
Содержание
- 1 Reverse a sequence
- 2 Reverse the order of the found element with value 3 and all following elements
- 3 Sort and reverse an int array
- 4 Use reverse to reverse order from second to last element but one
- 5 Use reverse to reverse the order of elements
- 6 Using the STL generic reverse algorithm with a vector
Reverse a sequence
<source lang="cpp">
- include <iostream>
- include <vector>
- include <algorithm>
using namespace std; void show(const char *msg, vector<int> vect); int main() {
vector<int> v; for(int i=0; i<10; i++) v.push_back(i); show("Original order: ", v); reverse(v.begin(), v.end()); show("After reversal: ", v); return 0;
} void show(const char *msg, vector<int> vect) {
cout << msg << endl; for(unsigned i=0; i < vect.size(); ++i) cout << vect[i] << endl;
}
</source>
Reverse the order of the found element with value 3 and all following elements
<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. */
- include <iostream>
- include <vector>
- include <algorithm>
using namespace std; int main() {
vector<int> coll; vector<int>::iterator pos; // insert elements from 1 to 6 in arbitrary order coll.push_back(2); coll.push_back(5); coll.push_back(4); coll.push_back(1); coll.push_back(6); coll.push_back(3); // find the first element with value 3 pos = find (coll.begin(), coll.end(), // range 3); // value // reverse the order of the found element with value 3 and all following elements reverse (pos, coll.end()); // print all elements for (pos=coll.begin(); pos!=coll.end(); ++pos) { cout << *pos << " "; } cout << endl;
} /* 2 5 4 1 6 3
*/ </source>
Sort and reverse an int array
<source lang="cpp">
- include <algorithm>
- include <iostream>
- include <iterator>
using namespace std; int main( ) {
const int num_costs = 4; const float cost[num_costs] = { 4.77, 6.99, 8.88, 9.22 }; copy( cost, cost + num_costs,ostream_iterator<float>( cout, " " ) );
const char* fruit[] = { "A", "B", "C" }; copy( fruit, fruit + sizeof( fruit ) / sizeof( fruit[0] ), ostream_iterator<const char*>( cout, " " ) ); int year[] = { 2001, 2002, 2003, 2004, 2005 }; const int num_years = sizeof( year ) / sizeof( year[0] ); copy( year, year + num_years,ostream_iterator<int>( cout, " " ) ); sort( year, year + num_years ); copy( year, year + num_years,ostream_iterator<int>( cout, " " ) ); reverse( year, year + num_years ); copy( year, year + num_years,ostream_iterator<int>( cout, " " ) );
}
</source>
Use reverse to reverse order from second to last element but one
<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. */
- 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: "); // reverse order from second to last element but one reverse (coll.begin()+1, coll.end()-1); PRINT_ELEMENTS(coll,"coll: ");
} /* coll: 1 2 3 4 5 6 7 8 9 coll: 1 8 7 6 5 4 3 2 9
*/ </source>
Use reverse to reverse the order of elements
<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. */
- 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: "); // reverse order of elements reverse (coll.begin(), coll.end()); PRINT_ELEMENTS(coll,"coll: ");
}
/*
coll: 1 2 3 4 5 6 7 8 9 coll: 9 8 7 6 5 4 3 2 1
*/ </source>
Using the STL generic reverse algorithm with a vector
<source lang="cpp">
- include <iostream>
- include <vector>
- include <cassert>
- include <algorithm> // For reverse
using namespace std; template <typename Container> Container make(const char s[]) {
return Container(&s[0], &s[strlen(s)]);
} int main() {
vector<char> vector1 = make< vector<char> >("abc"); reverse(vector1.begin(), vector1.end()); assert (vector1 == make< vector<char> >("cba")); return 0;
}
</source>