2017-03-12 5 views
0

私はコード内でベクトルの消去関数を使用しないdequeのためのpop_front()/pop_back()メンバ関数の実装に取り​​組んでいます。 vecOneが空であるpop_front()についてはdeque実装でもう1つのベクトルを別のベクトルに移動する

  • 場合、vecTwoからの要素の最初の半分は、その後、vecOneに移動されvecOnepop_back()が呼び出されます。基本的には、ここにタスクがあります。 pop_back()について
  • vecTwoが空の場合、vecOneからの要素の最初の半分は、その後、pop_back()vecTwo上が呼び出され、vecTwoに移動されます。

私は、次のコードを書かれているが、それはすべてのケースでは動作しません:

例えば
template <class T> 
void Deque <T>::pop_front() 
{ 
    if (vecOne.empty() && vecTwo.empty()) { 
     return; 
    } 
    if (vecOne.empty()) { 
     if (vecTwo.size() == 1) { 
      vecTwo.pop_back(); 
     } else { 
      for (int i = (vecTwo.size()-1)/2; i > -1; --i) { 
       vecOne.push_back(vecTwo[i]); 
       vecTwo[i] = vecTwo.back(); 
       vecTwo.pop_back(); 
      } 
      vecOne.pop_back(); 
     } 
    } else { 
     vecOne.pop_back(); 
    } 
} 

最初のベクトルvecOneには要素がありませんが、vecTwoは5 (60, 70, 80, 90, 100)です。このコードでは、私は次のような結果が得られます:

vecOneは数字を持っている60、70、および外にある(
vecTwoは数字100を有し、かつ90(私が取得すべきかである)の順に80注文)。

私はその後、pop_backながら一人でvecOne上の最後の要素を残りvecTwo要素を残し誰かが私がvecOneに移動しvecTwoから要素の最初の1/2を取得しようとしていた場合、私は私が間違っているのか理解に役立つことを願ってこれは、両端キューの前面です。

+0

なぜあなたは独自の両端キューを作成していますか? 'std :: deque'の実装(これは最適です)は、このタイプのデータを効率的に処理するリングバッファに基づいています。 –

答えて

0

vecTwoには偶数の要素がないためです。 何が起こるのですか:

vecTwoは{50,60,70}で分割されてvecOneに移動し、{90,100}はvecTwoに移動します。

初期値:

v1 = {}; 
v2 = {60, 70, 80, 90, 100} 

I = 2

v1 = {80}; 
v2 = {60, 70, 100, 90} 

I = 1

v1 = {80, 70}; 
v2 = {60, 90, 100} 

I = 0

v1 = {80, 70, 60} 
v2 = {100, 90} 

それを解決するには、vecTwoのサイズが均一でないかどうかを確認し、vecOneにプッシュし、vecTwoで移動してポップバックするのをスキップする必要があります。

int i = (size - 1)/2 
if (size % 2 != 0) // if not even 
{ 
    vecOne.push_back(vecTwo[i]); 
    --i; 
} 

while(i != 0) 
{ 
    // do what you do now in the for loop 
} 

if (size % 2 != 0) vecTwo.pop_back(); // if we skipped one pop it now 
関連する問題