2016-10-10 7 views
0
​​

2d_vectorはn * 3ベクトルである。 2d_vector = {{0,0,2}、{0,0,1}、{0,0,0}、{0,0、-1}}このベクトルの要素を判断することにより、第2のベクトルC++の1つのベクトルを消去する。

この2d_vectorの要素を消去しようとしていました「2d_vector [i] [2] == -1」に適合する。ここで、iは0からnまでである。 次のように私のコードは次のとおりです。

vector< vector<int> >::iterator it = 2d_vector.begin(); 
    for(;it<2d_vector.end();it+=3){ 
     if(**(it+2) == -1){   
      it = staticBlocks.erase(it); 
     } 
    } 

をしかし、それは動作しません。 どうすればいいですか? ありがとうございます。

+0

*に合うn個の合計数を示しますこの2d_vectorの要素の –

+2

あなたのコードは確かにコンパイルできません。 '2d_vector'は識別子のための有効な名前ではありません。代わりに 'vector_2d'を使用してください。 –

+0

[MCve]が必要です。 – Yakk

答えて

0

**(it+2)を分解しましょう。 it+2は、itによって参照されるものの後の第2のvectorを指す。 *(it+2)は、イテレータを逆参照し、itによって参照されるものの後に2番目のvectorを取得します。これはポインタまたはイテレータではなく、vectorです。逆参照することはできませんので、**(it+2)は破棄されます。しかし、(*(it+2))[0]あなたが欲しいと思われるものを行うべきです。

これは、it+2が範囲内であることを前提としています。

+0

この方法で試してみましたが、プログラムはforループから打ち切ります。 –

+0

どこで停止しますか?わからない場合は、開発環境のデバッガが役立つ可能性があります。 – user4581301

+0

forループ内のerase()操作の1つから異常終了します。 –

0

あなたはそのようなことを意味しましたか? :

std::vector<std::vector<int>> vec; 
    for (std::vector<std::vector<int>>::iterator it = vec.begin(); it != vec.end(); ++it) { 
    if (it->at(2) == -1){ 
     vec.erase(it); 
     --it; // This may fix it, if a vector gets deleted, the rest of the list goes one step towards the beggining of it and the next vector will be skipped 
    } 
} 

それが収まるこの2d_vectorのこの

消去要素 "2d_vectorを[I] [2] == -1"、

+0

私はこの方法で試しましたが、プログラムはforループから打ち切ります。 –

+0

どこ?どうやって?あなたの答えを編集する、私はなぜ理解していない – Treycos

+0

私は、それを試してみたと思う – Treycos

関連する問題