旋转矢量(数组)

时间:2012-07-05 11:10:41

标签: 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);

但是我收到了这个错误:

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>'

我该如何解决?

由于

6 个答案:

答案 0 :(得分:14)

标准库中有std::rotate algorithm

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

答案 1 :(得分:8)

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

v.insert( v.begin(), v.back() );
v.erase( std::prev( v.end() ) );

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

答案 2 :(得分:3)

inserterase的参数是迭代器,而不是索引:

ObjectToRotate.insert(ObjectToRotate.begin(), ObjectToRotate.back());
ObjectToRotate.pop_back();  // or erase(ObjectToRotate.end()-1), if you prefer

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

auto back = ObjectToRotate.back();
ObjectToRotate.pop_back();
ObjectToRotate.insert(ObjectToRotate.begin(), back);

或使用std::rotate

std::rotate(ObjectToRotate.begin(), ObjectToRotate.end()-1, ObjectToRotate.end());

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

答案 3 :(得分:1)

答案 4 :(得分:0)

使[1,2,3]到[2.3.1]这里是代码

vector<int> Solution::rotateArray(vector<int> &A, int B) {
vector<int> ret; 
for (int i = 0; i < A.size(); i++) {
    ret.push_back(A[(i + B) % A.size()]);
}
return ret; 

}

这里A是[1,2,3],B是1移位1位

答案 5 :(得分:0)

James Kanze建议使用以下代码片段旋转单个元素,这是一个绝佳的答案。要轮换 x 个项目,只需将以下代码放入循环中即可。

vec.insert( vec.begin(), vec.back() );
vec.erase( std::prev( vec.end() ) );

但是,如果您可以使用标准旋转功能,那将是您的最佳选择。下面的代码再次轮换了 x 个项目。

std::rotate(vec.rbegin(), vec.rbegin() + x, vec.rend());