2011-11-17 10 views
4

私は、ベクトルの内容全体をC++のキューにコピーしようとしています。これは組み込み関数ですか、それとも各要素をループするのは自然でしょうか?ベクトル全体をどのようにしてキューにコピーできますか?

+4

関連する質問を参照してください:http://stackoverflow.com/questions/1723515/insert-into-an-stl-queue-using-stdcopy – yairchu

+0

'std :: vector'と' std :: queue '?もしそうでなければ 'std :: deque'を使います。 –

答えて

11

あなたは新しいキューを作成する場合は、コンストラクタを使用することができますすでにキュー場合

std::vector<int> v = get_vector(); 

std::queue<long int, std::deque<long int>> q(std::deque<long int>(v.begin(), 
                    v.end())); 

dequeはおそらく最高ですが、あなたは、味に根本的なコンテナを変更することができます。)

を存在している、何の範囲ベースのアルゴリズムはありません、しかし、あなたは簡単に独自のを書くことができます:余談として

template <typename Iter, typename Q> 
push_range(Q & q, Iter begin, Iter end) 
{ 
    for (; begin != end; ++begin) 
     q.push(*begin); 
} 

:あなたのアルゴリズムはflexibiの量を必要とする場合あなたはおそらく最初にstd::dequeを使用したほうがよいでしょう。コンテナアダプタ(queuestack)は、「これは必要な動作です」(プッシュ/ポップ)と明示的に言う場合にのみ使用してください。

+0

OPは 'deque'ではなく' queue'について尋ねています。 –

+1

一般的なアルゴリズムでは、コードを3行長くしても、高価なコピーを潜在的に(この場合はIter :: value_typeに依存して)避けるので、常に++開始から 'begin ++ 'を優先します。 –

+2

@BjörnPollex:いいえ、同じ行数:-)もう一度おねがいします! –

2

次のようにキューのコンストラクタは次のとおりです。

explicit queue (const Container& ctnr = Container()); 

だから、あなたには、いくつかのベクトルvを持って、それからキューを構築することができます。

vector<int> v; 
deque<int> d; 
/* some random magic code goes here */ 
queue<int, deque<int>> q(d(v)); 

ただし、既に初期化されたqのpush_back要素にはこれを実行できません。別のコンテナを使用し、キューを空にし、そのコンテナにベクターを追加し、そのベクトルから新しいキューを作成することができます。しかし、私はそれをすべてやっているのではなく、繰り返します。

最終回答:いいえ、キューに実装されているメソッドはありません。ベクターをデクエートまたは反復処理することができます。

+0

キューの基礎となるデータ構造としてベクトルを使用することは、パフォーマンス上の観点からは最適ではないかもしれません。 –

+0

私はそれをこのようにすることは可能だと考えましたが、主な問題は、基本的なコンテナが 'pop_font()'を実装しなければならないので、 'pop'要素を使用できないことです。 – log0

+0

次に、ベクトルからデキューからキューを作成する必要があります。そのため、むしろ繰り返し処理することになります。 – Goodwine

3

おそらく最も良い方法は、要素をキューに直接プッシュすることです。あなたは、アダプタ(Insert into an STL queue using std::copy)でキューをラップする必要があるため

でもSTDを使用して
std::vector<T> v; 
... 
std::queue<T> q; 
for (const auto& e: v) 
    q.push(e) 

::コピーが面倒です。

+0

真実ですが、何が必要なのかによって異なります。私はベクトルを与えられた状況を持っていたので、それを待ち行列に入れたいと思っていました(実際に要素を削除せずにpopメソッドが必要でした)。また、私は要素をコピーしたくない(ミリ秒ごとに)。このような状況では、引数として与えられたベクトルをとる独自の単純なキューを単純に実装するほうがはるかに簡単です。残りは自明です。 –

関連する問題