c++ 旋转矢量(阵列)

55ooxyrt  于 2023-01-18  发布在  其他
关注(0)|答案(6)|浏览(162)

我正在尝试在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>'
我该怎么解决呢?

yrdbyhpb

yrdbyhpb1#

标准库中有一个std::rotate algorithm

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

bcs8qyzn2#

当然,推荐使用std::rotate是完全正确的;使用现有的函数总是首选的解决方案。尽管如此,还是有必要指出您的解决方案不起作用的原因。标准库中的容器,如std::vector,以迭代器的形式获取位置信息,而不是索引。编写操作的惯用方法是:

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

(If如果你没有C++11,那么编写你自己的prev版本就很简单了,或者对于vector,你可以直接写v.end() - 1。)

ws51t4hk

ws51t4hk3#

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变慢。

jfewjypa

jfewjypa5#

James Kanze给出了一个很好的解决方法,使用下面的代码片段来旋转单个元素。要旋转 x 个元素,只需将下面的代码放入一个循环中。

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

如果你能使用标准的rotate函数,那将是你最好的选择。下面的代码也是旋转 x 个项目,参见CPP docs about rotate,他们甚至提供了显示左右旋转的代码示例。:)

// simple rotation to the left
    std::rotate(vec.begin(), vec.begin() + x, vec.end());
  
    // simple rotation to the right
    std::rotate(vec.rbegin(), vec.rbegin() + x, vec.rend());
mwngjboj

mwngjboj6#

将[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个位置

相关问题