0

ベクトルのベクトルがあります。最初のコンポーネントを読み取り、特定の値よりも小さい場合、または別の値よりも大きい場合は、ベクトルから削除したいと思います。これどうやってするの?私のコードは次のとおりです。

int d = sum_et.size();                
vector <float>sum_et                                    
vector <float>sum_ieta_iphi;
vector <vector<float> >v;
sum_et.push_back(energySum);
sum_ieta_iphi[0]=energySum;
sum_ieta_iphi[1]=ieta;
sum_ieta_iphi[2]=iphi;
v.push_back(sum_ieta_iphi);
float max,min;
max=sum_et[(int)(19/20*d)];
min=sum_et[(int)(d/20)];


for (int i=0;i<v.size();i++){
/* line 312 */  if (v[i[0][0][0]]<min || v[i[0][0][0]]>max){
/* line 313 */      v.erase(v[i]);
  }
}

次のエラーが表示されます。

Analysis.cc:312:16: error: invalid types 'int[int]' for array subscript   
Analysis.cc:312:37: error: invalid types 'int[int]' for array subscript
Analysis.cc:313:14: error: no matching function for call to 'std::vector<std::vector<float> >::erase(std::vector<float>&)'
4

3 に答える 3

2

i問題は、ベクトルではない何か (整数変数) にインデックスを付けていることです。


これを行うためのより良い方法もあります。C++ には、標準ライブラリに多くの優れたアルゴリズムがあることを思い出してください。たとえばstd::copy_if、述語が true の場合に、あるコレクションから別のコレクションにコピーします。

これを使用して、ベクターをそれ自体にコピーできます。

std::copy_if(std::begin(v), std::end(v), std::begin(v),
             [v, min, max](const vector<float>& value)
             { return v[value[0]] >= min && v[value[0]] <= max; });
于 2013-07-09T10:32:24.887 に答える
0

あなたはここで奇妙なことをしています:

v[i[0][0][0]]

特に、「配列サブスクリプションの無効なタイプ」の312行目のエラーを与えるiプレーンです。int

[0]それを超えて、これが正しく機能するためには、はるかに多くのことが必要だと思います.

于 2013-07-09T10:28:29.493 に答える
0

コードには 2 つの問題があります。iは整数なのでi[0][0][0]、ナンセンスです。さらに、関数eraseには、値ではなく、ベクトルの反復子が必要です。(参照参照

私が間違っていなければ、各サブベクトルの最初の要素を確認し、基準に一致する場合はサブベクトルを削除します。

alexisdm がコメントで指摘したように、私が最初に提案した for ループは要素を見逃しています。そのはず :

// We get an iterator on the first vector
vector<vector<float> >::iterator it = v.begin();
while(it != v.end())
{
    // We check the first element of the subvector pointed by the iterator
    if ( (*it).at(0) < min || (*it).at(0) > max)
    {
        // We erase the subvector of v and erase returns
        // an iterator to the next element
        it = v.erase(it);
    }
    else
    {
        // We go to next element
        it++;
    }
}

最初の機能していないループは次のとおりです。

// We get an iterator on the first vector
for(vector<vector<float> >::iterator it = v.begin(); it != v.end(); ++it)
{
    // We check the first element of the subvector pointed by the iterator
    if ( (*it).at(0) < min || (*it).at(0) > max)
    {
        // We erase the subvector of v
        it = v.erase(it);
    }
}
于 2013-07-09T10:36:55.033 に答える