C++/STL Algorithms Modifying sequence operations/reverse

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

Reverse a sequence

<source lang="cpp">

  1. include <iostream>
  2. include <vector>
  3. 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.
*/
  1. include <iostream>
  2. include <vector>
  3. 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">

  1. include <algorithm>
  2. include <iostream>
  3. 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.
*/
  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: ");
   // 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.
*/
  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: ");
   // 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">

  1. include <iostream>
  2. include <vector>
  3. include <cassert>
  4. 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>