ベクトルのようなネストされていないコンテナから削除するときは、次のようなことをします。
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イディオムです。
今、私は2番目のデータ構造vector<vector<unsigned int> >
またはを持っています。ここで、ビットセットに従ってdeque<vector<unsigned int> >
外部コンテナ要素(それ自体が内部タイプのコンテナです)を削除します。
- このネストされたコンテナタイプでerase-removeイディオムを使用することは可能ですか?
- もしそうなら、それはどのように可能ですか?
- 制限はありますか?(例: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を取得する方法。。
上に投稿された私の素朴なアプローチは、順次処理を数え、想定しています。
ご協力いただきありがとうございます。
サシャ
更新と警告
ベクトルoベクトルの場合、Stasソリューションはうまく機能しています。ただし、両端キューは連続して保存されないため、このソリューションはベクトルの両端キューでは機能しないと思います。これは、ファンクターのインデックスの計算が失敗することを意味します。
誰かがそれを確認できますか?