C++ Tutorial/STL Algorithms Modifying sequence operations/reverse
Содержание
Reverse a stack of integers
<source lang="cpp">#include <iostream>
- include <vector>
- include <algorithm>
using namespace std;
int main() {
vector<int> v; unsigned int i; for(i=0; i<10; i++) v.push_back(i); cout << "Initial: "; for(i=0; i<v.size(); i++) cout << v[i] << endl; reverse(v.begin(), v.end()); for(i=0; i<v.size(); i++) cout << v[i] << endl; return 0;
}</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;
}</source>
2 5 4 1 6 3
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: ");
}</source>
coll: 1 2 3 4 5 6 7 8 9 coll: 1 8 7 6 5 4 3 2 9
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: ");
}</source>
coll: 1 2 3 4 5 6 7 8 9 coll: 9 8 7 6 5 4 3 2 1
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>