2012-03-16 5 views
2

PythonのようにC++のリスト/ベクターを "囲む"ようにしたい。基本的には、リストの終わりからリストの始めに要素を移動したいと思います。私は明示的に新しいリストを作る必要はありません。PythonのようにC++のベクトルをラップする

my_list = [1, 2, 3, 4, 5] 
#[1, 2, 3, 4, 5] 

q = collections.deque(my_list) 
q.rotate(3) 
#deque([3, 4, 5, 1, 2]) 

私はSTLで両端キューに見えたが、私は回転に似て何も表示されません。

Pythonでは、私のようなものを書くことができます。イテレータやこれに類するものでこれを行う簡単な方法があるように思えます。

答えて

11

標準ライブラリからstd::rotateを探しています。イテレータで簡単にこれを行うことができます。

#include <algorithm> 

std::vector<T> v /* = populate() */; 
std::rotate(v.begin(), v.begin() + 3, v.end()); 

すべての順方向イテレータを使用できます。これはほとんどの(シーケンス)コンテナで使用できます。

+0

また、コンテナの長さに対していくつの要素を回転させるかに応じて、 'deque'や' list'は(かなり)良く機能します。 –

+1

@マークB:どのように? 'rotate'は、基本的なコンテナを変更することなく、要素単位で' swap'を介して実装されているようです...? –

+0

Woopsでは、 'rotate'を使うことができず、pop/push関数で手動で実装するか、' list'の場合は 'splice'を実装する必要があります。それを考えると、時期尚早の最適化だと私は確信しています。 –

-2

あなたは

#include <algorithm> 
std::reverse(my_list.begin(),my_list.end()); 

またはベクターに後方ループに

reverse_iterator rbegin(); 

を使用を使用することができます。

関連する問題