7

我正在尝试在 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<_Myvec> std::vector< Ty>::insert<cv::Point <_Tp>&>(std::_Vector_const_iterator<_Myvec>,_Valty)' : 无法转换参数 1从“int”到“std::_Vector_const_iterator<_Myvec>”

我该如何解决?

4

6 回答 6

17

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

std::rotate(ObjectToRotate.begin(),
            ObjectToRotate.end()-1, // this will be the new first element
            ObjectToRotate.end());
于 2012-07-05T11:12:34.383 回答
9

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

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

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

于 2012-07-05T11:27:34.987 回答
5

insert和的参数erase是迭代器,而不是索引:

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

于 2012-07-05T11:15:27.203 回答
1

使用std::rotatehttp ://en.cppreference.com/w/cpp/algorithm/rotate

于 2012-07-05T11:12:10.200 回答
1

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());
于 2020-09-03T05:37:46.903 回答
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 个位置

于 2015-08-18T17:36:13.417 回答