gpt4 book ai didi

C++,std::list 的左/右旋转

转载 作者:太空狗 更新时间:2023-10-29 19:45:17 25 4
gpt4 key购买 nike

有什么方法可以使用 std::rotate 来处理列表

std::list<int> v = { 0,7, 1,2 };

因为这些左/右旋转

std::rotate(v.begin(), v.begin() + 1, v.end());
std::rotate(v.rbegin(), v.rbegin() + 1, v.rend());

为 vector 工作?

std::vector<int> v = { 0, 7, 1, 2 };

一种可能的方法是将列表复制到 vector 中

std::vector<int> u{ std::begin(v), std::end(v) };

反之亦然,但我发现它太“冗长”......列表的直接旋转会导致以下错误:

Error   C2672   'std::rotate': no matching overloaded function found    
Error C2676 binary '+': std::_List_iterator<std::_List_val<std::_List_simple_types<_Ty>>>' does not define this operator or a conversion to a type acceptable to the predefined operator

感谢您的帮助。

最佳答案

您不能添加到 std::list 迭代器,因为它不是随机访问。但是你可以增加它。这就是 std::next 为您所做的:

template< class Item >
void rot_slow( std::list<Item>& seq )
{
std::rotate( seq.begin(), next( seq.begin() ), seq.end() );
}

但是,此逻辑使用 std::rotate,使用 O(n) 交换操作。

这是不必要的低效。如果您想轮换列表中的所有项目,那就是 O(n²) 的复杂性。它很快变得非常慢。

而是将第一项拼接在列表的末尾:

template< class Item >
void rot_fast( std::list<Item>& seq )
{
seq.splice( seq.end(), seq, seq.begin() );
}

这使用 0 项交换,O(1) 复杂度。

关于C++,std::list 的左/右旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52052618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com