C++中的无移位循环数组元素

2024-04-24 00:17:39 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种方法可以在C++中转换数组元素而不使用任何循环,比如下面的Python代码,它只通过操纵列表索引

来改变列表元素
def rotate(lst, n):
  n = n % len(lst)
  return lst[n:] + lst[:n]

> rotate([1,2,3,4,5], 1)  # rotate forward
[2, 3, 4, 5, 1]

Tags: 方法代码元素列表lenreturndef数组
1条回答
网友
1楼 · 发布于 2024-04-24 00:17:39

C++标准算法也适用于数组,所以可以只使用^{}^{}。在

不过,在Python示例中,函数的接口比旋转要复杂一些。作为第二个参数,您必须为元素提供一个迭代器,该元素将成为结果数组中的第一个元素。在

对于一个数组{ 1, 2, 3, 4, 5 }和一个元素的前向旋转,这将是第二个元素(“2”)。通过将1添加到数组的第一个元素的迭代器中,可以得到该元素的迭代器,例如array.begin() + 1,假设您使用std::array,或者{},如果它是原始数组的话。在

#include <iostream>
#include <algorithm>
#include <array>

int main()
{
    std::array<int, 5> array = { 1, 2, 3, 4, 5 };
    std::rotate(
        array.begin(),
        array.begin() + 1,
        array.end()
    );    

    for (auto&& element : array)
    {
        std::cout << element << "\n";
    }
}

如果您希望在Python代码中使用类似的接口,那么可以将std::rotate包装在自己的函数中,并提供一个int参数。这也是一个很好的机会,通过创建一个通用函数,可以与任何合适的容器一起使用,从而使整个组件更具可重用性:

^{pr2}$

注意std::beginstd::end如何确保原始数组(使用它们的begin+N语法)和容器类(使用它们的c.begin()+N语法)都受支持,并且std::advance使该函数适用于具有非随机访问迭代器的容器,如std::list(在这种情况下,必须重复递增迭代器才能使它们前进一个以上的元素)。在


顺便说一下,如果你想支持大于或等于容器大小的^ {< CD13>}参数,那么你可以使用C++ 17函数^{}或者只创建你自己的函数。或许可以使用assert捕捉意外的负参数:

^{3}$

相关问题 更多 >