С++ для начинающих


Алгоритм copy_backward()


template < class BidirectionalIterator1,

           class BidirectionalIterator2 >

BidirectionalIterator2

copy_backward( BidirectionalIterator1 first,

               BidirectionalIterator1 last1,

               BidirectionalIterator2 last2 )

copy_backward() ведет себя так же, как copy(), только элементы копируются в обратном порядке: копирование начинается с last1-1 и продолжается до first. Кроме того, элементы помещаются в целевой контейнер с конца, от позиции last2-1, пока не будет скопировано last1-first элементов.

Например, если дана последовательность {0,1,2,3,4,5}, мы можем скопировать последние три элемента (3,4,5) на место первых трех (0,1,2), установив first равным адресу значения 0, last1– адресу значения 3, а last2 – адресу значения 5. Тогда элемент 5 попадает на место элемента 2, элемент 4 – на место 1, а элемент 3 – на место 0. В результате получим последовательность {3,4,5,3,4,5}.

#include <algorithm>

#include <vector>

#include <iterator>

#include <iostream.h>

 

class print_elements {

public:

   void operator()( string elem ) {

        cout << elem

             << ( _line_cnt++%8 ? " " : "\n\t" );

   }

   static void reset_line_cnt() { _line_cnt = 1; }

 

private:

   static int _line_cnt;

};

 

int print_elements::_line_cnt = 1;

 

/* печатается:

   исходный список строк:

   The light untonsured hair grained and hued like

   pale oak

 

   после copy_backward( begin+1, end-3, end ):

   The light untonsured hair light untonsured hair grained

   and hued

*/

 

int main()

{

   string sa[] = {

      "The", "light", "untonsured", "hair",

            "grained", "and", "hued", "like", "pale", "oak" };

 

   vector< string, allocator > svec( sa, sa+10 );

 

   cout << "исходный список строк:\n\t";

   for_each( svec.begin(), svec.end(), print_elements() );

   cout << "\n\n";

 

   copy_backward( svec.begin()+1, svec.end()-3, svec.end() );

 

   print_elements::reset_line_cnt();

 

   cout << "после copy_backward( begin+1, end-3, end ):\n";

   for_each( svec.begin(), svec.end(), print_elements() );

   cout << "\n";

}




- Начало -  - Назад -  - Вперед -