我试图在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)
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.)
该参数insert和erase是迭代器,而不是指标:
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变慢。
| 归档时间: |
|
| 查看次数: |
11344 次 |
| 最近记录: |