C++ 如何在c+中旋转向量中的每n个元素+;

C++ 如何在c+中旋转向量中的每n个元素+;,c++,C++,我试图旋转向量中的每n个元素。我知道C++中有一个旋转函数,但是我如何旋转每一个第n个元素?< /p> 例如: ([71 65 74 88 63 100 45 35 67 11])-->[65 74 88 71 100 45 35 63 11 67] 对于上面的示例,如果n=4,则应在每4个元素处进行旋转 1st-->([71 65 74 88])-->([65 74 88 71]) 2nd-->([63 100 45 35])-->([100 45 35 6

我试图旋转向量中的每n个元素。我知道C++中有一个旋转函数,但是我如何旋转每一个第n个元素?< /p> 例如:

([71 65 74 88 63 100 45 35 67 11])-->[65 74 88 71 100 45 35 63 11 67] 
对于上面的示例,如果n=4,则应在每4个元素处进行旋转

1st-->([71 65 74 88])-->([65 74 88 71])

2nd-->([63 100 45 35])-->([100 45 35 63])

3rd-->([67 11])-->([11 67])

只需使用迭代器从初始向量创建具有指定最大长度的子范围,并旋转其中的每个子范围

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

template <class ForwardIterator>
void myrotate_nth (ForwardIterator first, ForwardIterator last,
                   typename std::iterator_traits<ForwardIterator>::difference_type n)
{
    while (last - first > n) {
        ForwardIterator tmp = first + n;
        rotate(first, first + 1, tmp);
        first = tmp;
    }
    rotate(first, first + 1, last);
}

int main()
{
    std::vector<int> v = { 71, 65, 74, 88, 63, 100, 45, 35, 67, 11 };
    myrotate_nth(v.begin(), v.end(), 4);
    for_each(v.begin(), v.end(), [](int c) { cout << c << "\t"; });
    cout << endl;
    return 0;
}

我原始答案的简化版本。旋转是否到位

void RoateEveryNth(vector<int>& vec, size_t n)
{
    if (n <= 1)
    {
        return;
    }

    size_t numChunks = vec.size() / n;
    size_t lastChunkSize = vec.size() % n;

    for (size_t chunk = 0; chunk < numChunks; chunk++)
    {
        size_t offset = chunk * n;
        int firstChunkValue = vec[chunk*n];
        for (size_t i = 1; i < n; i++)
        {
            vec[offset + i - 1] = vec[offset + i];
        }
        vec[offset + n - 1] = firstChunkValue;
    }

    if (lastChunkSize > 1)
    {
        size_t offset = numChunks * n;
        int firstChunkValue = vec[offset];
        for (size_t i = 1; i < lastChunkSize; i++)
        {
            vec[offset + i - 1] = vec[offset + i];
        }
        vec[offset + lastChunkSize - 1] = firstChunkValue;
    }
}

int main()
{
    std::vector<int> vec = { 71, 65, 74, 88, 63, 100, 45, 35, 67, 11 };
    RoateEveryNth(vec, 4);

    for (int i : vec)
    {
        cout << " " << i;
    }
    cout << endl;

    return 0;
}
void roateverynth(向量和向量,大小)
{
if(n1)
{
尺寸偏移量=numChunks*n;
int firstChunkValue=vec[offset];
对于(size\u t i=1;i好吧,我很惊讶地看到没有关于堆栈溢出的有趣的点击。+1用于询问。使用get的迭代器构造一个函数,以指定的最大长度创建子向量,并在每个子向量上循环调用。您尝试了什么?我没有看到第一个示例右侧的值63。因此,它不是cl听听你在问什么。“子范围”不是一个更好的术语吗?我想是的,它是。
void RoateEveryNth(vector<int>& vec, size_t n)
{
    if (n <= 1)
    {
        return;
    }

    size_t numChunks = vec.size() / n;
    size_t lastChunkSize = vec.size() % n;

    for (size_t chunk = 0; chunk < numChunks; chunk++)
    {
        size_t offset = chunk * n;
        int firstChunkValue = vec[chunk*n];
        for (size_t i = 1; i < n; i++)
        {
            vec[offset + i - 1] = vec[offset + i];
        }
        vec[offset + n - 1] = firstChunkValue;
    }

    if (lastChunkSize > 1)
    {
        size_t offset = numChunks * n;
        int firstChunkValue = vec[offset];
        for (size_t i = 1; i < lastChunkSize; i++)
        {
            vec[offset + i - 1] = vec[offset + i];
        }
        vec[offset + lastChunkSize - 1] = firstChunkValue;
    }
}

int main()
{
    std::vector<int> vec = { 71, 65, 74, 88, 63, 100, 45, 35, 67, 11 };
    RoateEveryNth(vec, 4);

    for (int i : vec)
    {
        cout << " " << i;
    }
    cout << endl;

    return 0;
}