ベクトルのようなネストされていないコンテナから削除するとき、私は次のようなことをしています:ネストされたコンテナ内の削除用イレーズを削除しますか? (外部のものを削除; C++ STL)
struct is_to_remove
{
is_to_remove(dynamic_bitset<>& x) : x(x) {}
const bool operator()(unsigned int id)
{
return x[id];
}
private:
dynamic_bitset<> x;
};
inline static void remove_elements_in_vector(vector<unsigned int>& vec, boost::dynamic_bitset<>& to_remove)
{
// use the erase-remove idiom to remove all elements marked in bitset
vec.erase(remove_if(vec.begin(), vec.end(), is_to_remove(to_remove)), vec.end());
}
これはいわゆるerase-remove idiomです。
今、私は、ビットセットに応じて外側のコンテナ要素(内部の型のコンテナ)を削除したい、2番目のデータ構造体vector<vector<unsigned int> >
またはdeque<vector<unsigned int> >
を持っています。
- このネストされたコンテナタイプで消去削除イディオムを使用できますか?
- そうなら、どうすれば可能ですか?
- 制限はありますか? (vecのようなvecは可能ですが、vecのdequeはできません)?
私の最初の簡単なアプローチは次のとおりです。私は、remove_ifが要素を順に反復し、順番にそれを決定すると仮定しました。 それは間違った仮定ですか?
struct is_to_remove_new
{
is_to_remove_new(dynamic_bitset<>& x, unsigned int index) : x(x), index(index) {}
const bool operator()(vector<unsigned int> & vec)
{
return x[index++];
}
private:
dynamic_bitset<> x;
unsigned int index;
};
inline static void remove_elements_in_vectorvector(vector<vector<unsigned int> >& vec, boost::dynamic_bitset<>& to_remove)
{
// use the erase-remove idiom to remove all elements marked in bitset
vec.erase(remove_if(vec.begin(), vec.end(), is_to_remove_new(to_remove, 0)), vec.end());
}
結果は間違っているので、私はここで正しい解決策を探しています。私はいくつかのことを仮定したと思いますが、保証されていません。私の場合、根本的な問題は次のとおりです。内部コンテナのIDを取得して削除するかどうかをチェックする方法。。
上記の私の素朴なアプローチは、ちょうどカウントし、逐次処理を前提としています。
あなたのお手伝いをありがとう。
Sascha
更新と警告
ベクトルoベクトルの場合、 Stasソリューションは素晴らしい動作をしています。しかし、私はデキューが連続した方法で保存されていないので、このソリューションはベクトルのデキューでは機能しないと思います。これは、ファンクタ内のインデックスの計算が失敗することを意味します。
誰でもそれを確認できますか?
作品。ありがとうございました。試してみよう次のこと:ベクトル :-)でこれを行います。 –
sascha
より多くのテストの後、私はこの解決策は外側のベクトル(連続した保証が保持されている)で動作しているが、外側の両端キューでは動作していないと思います。 anybodeはそれを確認できますか?私は、両端キューの非連続性のため、ファンクタの計算インデックスが間違っていると思います - >エラーです。 – sascha