我正在尝试在C++中旋转一个元素向量,我的意思是我有一个vector<point>
,我想把最后一个元素变成第一个元素。
示例:
[1,2,3]变成[3,1,2]然后[2,3,1]
为此,我试着做了以下几点:
//Add the last element at index 0
ObjectToRotate.insert(0, ObjectToRotate.at(ObjectToRotate.size()-1));
//Remove Last element
ObjectToRotate.erase(ObjectToRotate.size()-1);
但我得到了这个错误:
错误6错误C2664: "std::_Vector_iterator std::vector〈* Ty〉::insert〈cv::Point *&〉(std::_Vector_const_iterator,_Valty)":无法将参数1从"int"转换为"std::_Vector_const_iterator" <_Myvec> std::vector<Ty>::insert<cv::Point <_Tp>&>(std::_Vector_const_iterator <_Myvec>,_Valty)' : cannot convert parameter 1 from 'int' to 'std::_Vector_const_iterator <_Myvec>'
我该怎么解决呢?
6条答案
按热度按时间yrdbyhpb1#
标准库中有一个
std::rotate
algorithm:bcs8qyzn2#
当然,推荐使用
std::rotate
是完全正确的;使用现有的函数总是首选的解决方案。尽管如此,还是有必要指出您的解决方案不起作用的原因。标准库中的容器,如std::vector
,以迭代器的形式获取位置信息,而不是索引。编写操作的惯用方法是:(If如果你没有C++11,那么编写你自己的
prev
版本就很简单了,或者对于vector
,你可以直接写v.end() - 1
。)ws51t4hk3#
insert
和erase
的参数是迭代器,而不是索引:但是首先移除最后一个元素(在获取副本之后)可能更有效,以避免重新分配的可能性:
或者使用
std::rotate
:如果您经常这样做,那么
deque
可能是容器的更好选择,因为它允许在两端高效地插入和移除。但是,如果速度很重要,请确保您测量并验证这确实是一个改进;如果序列不是很大,那么来自更复杂的内存布局的开销可能会使deque
变慢。yzckvree4#
使用
std::rotate
:http://en.cppreference.com/w/cpp/algorithm/rotatejfewjypa5#
James Kanze给出了一个很好的解决方法,使用下面的代码片段来旋转单个元素。要旋转 x 个元素,只需将下面的代码放入一个循环中。
如果你能使用标准的rotate函数,那将是你最好的选择。下面的代码也是旋转 x 个项目,参见CPP docs about rotate,他们甚至提供了显示左右旋转的代码示例。:)
mwngjboj6#
将[1,2,3]转换为[2,3,1]的代码如下
这里A是[1,2,3]且B是1以移动1个位置