2024-04-24 00:17:39 发布
网友
有没有一种方法可以在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]
C++标准算法也适用于数组,所以可以只使用^{}或^{}。在
不过,在Python示例中,函数的接口比旋转要复杂一些。作为第二个参数,您必须为元素提供一个迭代器,该元素将成为结果数组中的第一个元素。在
对于一个数组{ 1, 2, 3, 4, 5 }和一个元素的前向旋转,这将是第二个元素(“2”)。通过将1添加到数组的第一个元素的迭代器中,可以得到该元素的迭代器,例如array.begin() + 1,假设您使用std::array,或者{},如果它是原始数组的话。在
{ 1, 2, 3, 4, 5 }
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参数。这也是一个很好的机会,通过创建一个通用函数,可以与任何合适的容器一起使用,从而使整个组件更具可重用性:
std::rotate
int
注意std::begin和std::end如何确保原始数组(使用它们的begin+N语法)和容器类(使用它们的c.begin()+N语法)都受支持,并且std::advance使该函数适用于具有非随机访问迭代器的容器,如std::list(在这种情况下,必须重复递增迭代器才能使它们前进一个以上的元素)。在
std::begin
std::end
std::advance
std::list
assert
C++标准算法也适用于数组,所以可以只使用^{} 或^{} 。在
不过,在Python示例中,函数的接口比旋转要复杂一些。作为第二个参数,您必须为元素提供一个迭代器,该元素将成为结果数组中的第一个元素。在
对于一个数组},如果它是原始数组的话。在
{ 1, 2, 3, 4, 5 }
和一个元素的前向旋转,这将是第二个元素(“2”)。通过将1添加到数组的第一个元素的迭代器中,可以得到该元素的迭代器,例如array.begin() + 1
,假设您使用std::array
,或者{如果您希望在Python代码中使用类似的接口,那么可以将
^{pr2}$std::rotate
包装在自己的函数中,并提供一个int
参数。这也是一个很好的机会,通过创建一个通用函数,可以与任何合适的容器一起使用,从而使整个组件更具可重用性:注意
std::begin
和std::end
如何确保原始数组(使用它们的begin+N语法)和容器类(使用它们的c.begin()+N语法)都受支持,并且std::advance
使该函数适用于具有非随机访问迭代器的容器,如std::list
(在这种情况下,必须重复递增迭代器才能使它们前进一个以上的元素)。在顺便说一下,如果你想支持大于或等于容器大小的^ {< CD13>}参数,那么你可以使用C++ 17函数^{
assert
捕捉意外的负参数: ^{3}$相关问题 更多 >
编程相关推荐