0

データを含む 2D ベクトルがあり、(述語関数に基づいて) 考慮する必要がない場合は、要素/ブロックを削除する必要があります。関数は次のとおりです。

bool thresholdNegative (vector<double> val)
{

//short threshold = 10000;
double meansquare = sqrt ( ( std::inner_product( val.begin(), val.end(), val.begin(), 0 ))/(double)val.size() );

if(meansquare < 0)
{
    return true;
}else{
    return false;
}
 }

そして、私は以下を使用します:

std::remove_if(std::begin(d), std::end(d), thresholdNegative);

dすべてのデータを含む 2D ベクトルはどこにありますか。

thresholdNegative問題は、関数が true を返すにもかかわらず、ブロックから情報を削除していないように見えることです。

理由はありますか?

4

2 に答える 2

5

それがどのように機能するかremove_ifです。実際にはコンテナーから何も削除しません (どうして、イテレーターを 2 つしか取得できないのでしょうか?) 代わりに、要素を並べ替えて、コンテナーにとどまるはずの要素がコンテナーの先頭に集められるようにします。次に、この関数は、要素を実際に削除するために使用できるコンテナーの新しい末尾に反復子を返します。

d.erase( std::remove_if(begin(d), end(d), threshold_negative), end(d) );

上記の行はErase-remove idiomと呼ばれるものを使用しています。

于 2013-09-14T14:10:46.617 に答える
2

消去は次の方法で行われます。

auto newEnd = std::remove_if(std::begin(d), std::end(d), thresholdNegative);
d.erase(newEnd, end(d));

std::remove_if のドキュメントを読むことを強くお勧めします

于 2013-09-14T14:13:09.003 に答える