旋转矢量(数组)

You*_*sef 7 c++ vector

我试图在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);
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

Error   6   error C2664: 'std::_Vector_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>'
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

谢谢

R. *_*des 14

标准库中有一个std::rotate算法:

std::rotate(ObjectToRotate.begin(),
            ObjectToRotate.end()-1, // this will be the new first element
            ObjectToRotate.end());
Run Code Online (Sandbox Code Playgroud)

  • @CharlesBeattie:`deque`没有`rotate`成员函数. (5认同)

Jam*_*nze 8

std::rotate当然,使用的建议是完全正确的; 使用现有功能始终是可用的首选解决方案.从来没有,值得指出为什么你的解决方案不起作用.标准库中的容器,如std::vector迭代器而不是索引的形式获取位置信息.编写您的操作的惯用方法是:

v.insert( v.begin(), v.back() );
v.erase( std::prev( v.end() ) );
Run Code Online (Sandbox Code Playgroud)

(如果你没有C++ 11,那么编写你自己的版本就非常简单prev.或者在vector你的情况下,你可以写v.end() - 1.)


Mik*_*our 5

该参数inserterase是迭代器,而不是指标:

ObjectToRotate.insert(ObjectToRotate.begin(), ObjectToRotate.back());
ObjectToRotate.pop_back();  // or erase(ObjectToRotate.end()-1), if you prefer
Run Code Online (Sandbox Code Playgroud)

但是先删除最后一个元素(在复制之后)可能更有效,以避免重新分配的可能性:

auto back = ObjectToRotate.back();
ObjectToRotate.pop_back();
ObjectToRotate.insert(ObjectToRotate.begin(), back);
Run Code Online (Sandbox Code Playgroud)

或使用std::rotate

std::rotate(ObjectToRotate.begin(), ObjectToRotate.end()-1, ObjectToRotate.end());
Run Code Online (Sandbox Code Playgroud)

如果您deque经常这样做,那么容器可能是更好的选择,因为这样可以在两端进行有效的插入和移除。但是,如果速度很重要,请确保您衡量并验证这确实是一种改进;如果序列不是很大,那么更复杂的内存布局的开销可能会deque变慢。