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::rotate: http://en.cppreference.com/w/cpp/algorithm/rotate

于 2012-07-05T11:12:10.200 に答える
0

for making [1,2,3] to [2,3,1] here is the code

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; 
}

here A is [1,2,3] and B is 1 to shift 1 position

于 2015-08-18T17:36:13.417 に答える