C++ 算法 中的 rotate_copy函数

首页 / C++入门教程 / C++ 算法 中的 rotate_copy函数

C++算法 rotate_copy()函数用于对[first,last)参数内的元素进行旋转复制。

  • 序列将从源序列中间的元素开始,最后一个元素之后是第一个。
  • 它将第一个元素和中间元素之间的元素附加到中间元素和最后一个元素之间的元素。

rotate_copy - 语法

template <class ForwardIterator, class OutputIterator>
OutputIterator rotate_copy (ForwardIterator first, ForwardIterator middle,
ForwardIterator last, OutputIterator result);

rotate_copy - 参数

first:一个正向迭代器,指向要旋转参数内第一个元素的位置。

middle:正向迭代器,它寻址到[first,last)参数内的元素,该元素被移至该参数内的第一位置。

last:前向迭代器,在元素反转参数内,将位置指向最后一个元素之后的位置。

result:一个输出迭代器,指向目标参数中第一个元素的位置。

rotate_copy - 返回值

rotation_copy()函数将输出迭代器的地址返回到复制参数的末尾。

rotate_copy - 例子1

让我们看一下旋转给定字符串的简单示例:

#include <algorithm>
#include <iostream>
#include <string>
#include <iterator>

using namespace std;

int main() {
  string str = " N I K I T A";
  string result;
 cout << "Before Rotate : "<< str << endl;
  rotate_copy(str.begin(), str.begin() + 2, str.end(),
    back_inserter(result));

  cout <<"After Rotate  : " << result << endl;
  
  return 0;
}

输出:

Before Rotate :  N I K I T A
After Rotate   :  I K I T A N

rotate_copy - 例子2

让我们看另一个简单的例子:

#include <algorithm>
#include <vector>
#include <iostream>

using namespace std;
 
int main()
{
    vector<int> src = {1, 2, 3, 4, 5}; 
    auto pivot = find(src.begin(), src.end(), 3); 
    vector<int> dest(src.size());                                          
 
    rotate_copy(src.begin(), pivot, src.end(), dest.begin());
 
    for (const auto &i : dest) {
        cout << i << ' ';
    }   
    cout << '\n';
    
    return 0;
}

输出:

3 4 5 1 2

rotate_copy - 例子3

让我们看另一个简单的例子:

#include <iostream>
#include <algorithm>
#include <vector>
#include <iomanip>
using namespace std;
 
void print(char a[], int N)
{   
    for(int i = 0; i < N; i++)
    {
        cout << (i + 1) << ". " << setw(1)
             << left << a[i] << "  ";
    }
    cout << endl;
}
 
int main()
{
    char s[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};
    int slen = sizeof(s)/sizeof(char), tlen = slen;
    char t[tlen];
 
    cout << "Character array s[] : ";
    print(s, slen);
    cout << "Rotate s[] with \'C\' as middle element and copy in t[]" << endl;
    rotate_copy(s, s + 2, s + slen, t);
    cout << "Character array t[] : ";
    print(t, tlen);
    cout << "Rotate t[] with \'A\' as middle element and copy in s[]" << endl;
    rotate_copy(t, t + 6, t + tlen, s);
    cout << "Character array s[] : ";
    print(s, slen);
    cout << "Character array t[] : ";
    print(t, tlen);
    
    return 0;
}

输出:

Character array s[] : 1. A  2. B  3. C  4. D  5. E  6. F  7. G  8. H  
Rotate s[] with 'C' as middle element and copy in t[]
Character array t[] : 1. C  2. D  3. E  4. F  5. G  6. H  7. A  8. B  
Rotate t[] with 'A' as middle element and copy in s[]
Character array s[] : 1. A  2. B  3. C  4. D  5. E  6. F  7. G  8. H  
Character array t[] : 1. C  2. D  3. E  4. F  5. G  6. H  7. A  8. B  

rotate_copy - 例子4

让我们看另一个简单的例子:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <functional>

using namespace std ;

int main()
{
    const int VECTOR_SIZE = 8 ;

   //Define a template class vector of strings
    typedef vector<string> StrVector ;

    //Define an iterator for template class vector of strings
    typedef StrVector::iterator StrVectorIt ;

    StrVector Tongue_Twister(VECTOR_SIZE) ;
    StrVector Rotated_Twister(VECTOR_SIZE) ;

    StrVectorIt start, middle, end, it, RTstart, RTend ;

    start = Tongue_Twister.begin() ;   //location of first
                                       //element of Tongue_Twister

    end = Tongue_Twister.end() ;       //one past the location last
                                       //element of Tongue_Twister

    middle = start + 3 ;               //start position for
                                       //rotating elements

    RTstart = Rotated_Twister.begin() ;//location of first
                                       //element of Rotated_Twister

    RTend = Rotated_Twister.end() ;    //one past the location last
                                       //element of Rotated_Twister

    //Initialize vector Tongue_Twister
    Tongue_Twister[0] = "she" ;
    Tongue_Twister[1] = "sells" ;
    Tongue_Twister[2] = "sea" ;
    Tongue_Twister[3] = "shells" ;
    Tongue_Twister[4] = "by";
    Tongue_Twister[5] = "the";
    Tongue_Twister[6] = "sea" ;
    Tongue_Twister[7] = "shore" ;

    cout << "Before calling rotate_copy:\n" << endl ;

   //print content of Tongue_Twister
    cout << "Try this Tongue Twister: " ;
    for(it = start; it != end; it++)
        cout << *it << " " ;
    cout << "\n\n" ;

   //rotate the items in the vector Tongue_Twist to the right by
   //3 positions and copy the results to Rotated_Twister
    rotate_copy(start, middle, end, RTstart) ;

    cout << "After calling rotate_copy:\n" << endl ;

   //print content of Tongue_Twister
    cout << "Tongue_Twister: " ;
    for(it = start; it != end; it++)
        cout << *it << " " ;
    cout << "\n\n" ;

   //print content of Rotated_Twister
    cout << "Now try the rotated Tongue Twister: " ;
    for(it = RTstart; it != RTend; it++)
        cout << *it << " " ;
    cout << "\n\n" ;
    
    return 0;
}

输出:

Before calling rotate_copy:

Try this Tongue Twister: she sells sea shells by the sea shore 

After calling rotate_copy:

Tongue_Twister: she sells sea shells by the sea shore 

Now try the rotated Tongue Twister: shells by the sea shore she sells sea

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

Vue开发实战 -〔唐金州〕

接口测试入门课 -〔陈磊〕

Selenium自动化测试实战 -〔郭宏志〕

跟着高手学复盘 -〔张鹏〕

Spark性能调优实战 -〔吴磊〕

Kubernetes入门实战课 -〔罗剑锋〕

商业思维案例笔记 -〔曹雄峰〕

现代React Web开发实战 -〔宋一玮〕

手把手带你写一个MiniSpring -〔郭屹〕

好记忆不如烂笔头。留下您的足迹吧 :)