2016-05-27 8 views
-3

vectorで要素を1つずつ消去するにはどうすればよいですか?特定の要素が削除された後、いくつかの条件を使ってベクトルをチェックしたいと思います。ベクトルの要素を消去して他の要素の条件をチェックする方法

このように試しましたが、うまくいきません。どうしましたか?例えば、v = {1, -2 , 3, -2 ,5 }についてv is already initialized

 long long max = maxSubArraySum(v); 
     long long t = 0; 

     for(long long i = 0; i < n ; i++){ 
      std::vector<long long> cv; 
      cv = v; 
      //cout << "i = " << i << "v = " <<v[i] << '\n'; 
      cv.erase(find(cv.begin(),cv.end(),v[i])); // <—- wrong 
      // EDIT 
      // cv.erase(cv.begin()+i); <—- fix. 
      t = maxSubArraySum(cv); 
      //cout << "t = " << t << '\n'; 
      if(t > max){ 
       max = t; 
       //cout << max << '\n'; 
      } 
     } 
     // cout << max << '\n'; 
    } 

} 

  • I次いでmaxSubArraySum6 for this subarray {3,-2,5}あるcv = {-2,3,-2,5 }ためなり、最初1取り除きます。私は-2を除去
  • 次に、その後maxSubArraySum私は3を除去6 for this subarray {3,-2,5}
  • 次にであるcv = {1, 3,-2,5}ためなり、その後maxSubArraySum私は-2を除去-2 for this subarray {-2,5}
  • 次にであるcv = {1, -2,-2,5}ためなり、その後maxSubArraySumcv = {1, -2, 3, 5}ためであろう8 for this subarray {3,5}
  • 次に、5を削除すると、maxSubArraySumは、cv = {1, -2,3,-2}となります。4 for this subarray {1,-2,3}

C++にはどのようにコードするのですか?

編集: 私は答えを得た。 最初の要素を削除していたので、コードが少しオフになりましたfindが見つかりました。重複の場合、これはエラーを示しました。 そこで、インデックスを削除するように変更しました。 ありがとうございます。

+0

@LogicStuffでは、 'cv'は' v'の一時コピーです。コピーを修正した後、それは破棄され、変更されていないオリジナルの「v」から再び作成されます。あなたは、なぜ 'v'から直接消去できないのかを正しく答えるために、より多くのコードを提供する必要があります。私はあなたに理由があると仮定し、あなたは彼らが何と言うのかを知っています。何?あなたは彼らの言うことを知らないのですか?まあまあ。 – user4581301

+0

'vv 'を' cv'にコピーしないと、私はそれらを消去するときに要素を一つずつ失ってしまいます。インデックス '1'の要素を消去し、' maxSum'を見つけてから、最初の 'ベクトル'から再びインデックス '2'の要素を消去する必要があります。 –

+0

私が言ったように、あなたは理由があると思います。私はそれが良いものだと思います。しかし、私は理由を知っていません**あなたが自分自身に見つかった問題からあなたを救う方法について良い提案をすることはできません。@ Shreevardhanの答えはあなたの投稿のコンテキストコード。より多くの文脈とより多くのコードなしでそれ以上の答えを得ることはできません。そのため、Segfaultが動作するべきことをする理由を知ることができます。 – user4581301

答えて

1

を作る代わりに、直接vを使用しています。これを試してください:

 cv.erase(cv.begin()+i); 

これは、要素をi番目の位置に見つけて、ポインタ演算を使用して削除します。

+0

問題は 'cv'は' v'の一時コピーです。 OPは間違った「ベクトル」から消去しています。 – user4581301

0

forループ(外側)の前にベクトルcvを宣言すると、問題が解決されます。簡単にするために、コピーあなたが見つける使用する必要はありません

while (!v.empty()) { 
    v.erase(v.begin()); 
    cout << endl; 
    long long t = maxSubArraySum(v); 
    if (t > max) { 
     max = t; 
     // cout << max << endl; 
    } 
} 
+0

これは私に 'Segmentation fault:11'を与えます。 –

+0

@sudoankit 'v'が少なくとも' n '個の要素を持つ場合、これはsegフォールトを与えてはなりません。デバッガを使用して、正確にどこにあるかを確認することができます。 – Shreevardhan

関連する問題