2016-06-18 6 views
0
int main(){ 
    std::vector<int> vec; 
    vec.push_back(1); 
    vec.push_back(2); 
    vec.push_back(vec[0]); 
    for (auto it = vec.begin(); it != vec.end(); it++) { 
     std::cout << *it << std::endl; 
    } 
    return 0; 
} 

これは[1、2、1]を出力します。これは、ベクトルがvec [0]のコピーを作成して戻しているためです。しかし、私は[2、1]のような出力をしたいと思いますし、push_back()を使わずにこれを達成してからerase()を使わなければならないのか不思議でした。要素をベクトルの最後に移動するにはどうすればよいですか?

目的:ベクトルがそれに応じて調整される間に、ベクトルの要素を最後まで移動できるようにしたいので、5番目の要素を最後まで移動すると、元の5番目の要素位置が上に移動するので、新しい5番目の位置は元の6番目の位置に要素を持ちます。

+0

"ベクトル内の要素を最後に移動する"は、後者が意味するものであれば、 "参照を元に戻す"とは大きく異なります。 –

+0

代わりにリストを使うほうがいいですか? – skypjack

+0

@skypjackそう思わない。削除/挿入ポイントを見つけるコストは支配的です。プリフェッチャはノードベースのデータ構造を好まない。 –

答えて

7

あなたはおそらくstd::rotateを探しています。パラメータの

int main() { 
    //Fill vector 
    std::vector<int> vec; 
    vec.push_back(1); 
    vec.push_back(2); 
    vec.push_back(3); 

    //move first element to the end 
    std::rotate(vec.begin(), vec.begin() + 1, vec.end()); 

    //print content 
    for (auto e:vec) { 
     std::cout << e << std::endl; 
    } 
} 

説明:

  • 最初と最後のパラメータは(そうここで容器全体)の周りに移動されるすべての要素の範囲を示します。
  • 2番目のパラメータは、回転後にの最初の位置にあるの要素のイテレータです。最初の要素を最後まで移動したい場合、2番目の要素は前面に移動する要素(インデックス1)です。

基本的に、第2パラメータと第1パラメータ(ここでは1)の間の距離を要素の数として見ると、範囲がシフトします。

+0

ああ私はこれが私が探していたものだと思う。ありがとう:) – ygongdev

関連する問題