📜  在 cpp 中旋转 - C++ (1)

📅  最后修改于: 2023-12-03 15:07:38.354000             🧑  作者: Mango

在 C++ 中旋转

旋转是指将数组或向量等容器中的元素按照一定规律进行换位操作。在 C++ 中,可以通过以下方式实现旋转操作:

std::rotate

std::rotate 是 C++ 标准库提供的旋转函数,可以对 std::vector 及其它容器进行旋转操作。其函数原型为:

template <class ForwardIt>
void rotate(ForwardIt first, ForwardIt n_first, ForwardIt last);

rotate 函数接受三个迭代器作为参数。其中,first 是要旋转的元素的起始位置,n_first 是旋转后的第一个元素的位置,last 是要旋转的元素的结束位置。

下面是一个例子:

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

int main()
{
    std::vector<int> v{1, 2, 3, 4, 5};

    std::rotate(v.begin(), v.begin() + 2, v.end());

    for (auto i : v)
        std::cout << i << " ";

    return 0;
}

此时输出为:

3 4 5 1 2

这里将 v 中从第一个元素开始的两个元素旋转到了容器的末尾,得到了一个新的向量。

自行实现旋转

如果你想手动实现一个旋转函数,可以采用以下思路:

  1. firstn_first - 1 的元素逆序排列;
  2. n_firstlast - 1 的元素逆序排列;
  3. 将整个范围的元素逆序排列。

下面是一个示例实现:

#include <iostream>
#include <vector>

template <typename RandomAccessIterator>
void my_rotate(RandomAccessIterator first, RandomAccessIterator n_first, RandomAccessIterator last)
{
    std::reverse(first, n_first);
    std::reverse(n_first, last);
    std::reverse(first, last);
}

int main()
{
    std::vector<int> v{1, 2, 3, 4, 5};

    my_rotate(v.begin(), v.begin() + 2, v.end());

    for (auto i : v)
        std::cout << i << " ";

    return 0;
}

执行结果与前面的示例相同。

结论

无论是使用 std::rotate 还是手动实现旋转函数,都可以快速有效地对容器进行旋转操作。在实际应用中,可以根据需要选择不同的实现方式。