1

コンテナーを操作するときは、ループよりも効率的にアルゴリズムとメンバー関数を使用することをお勧めします。ただし、連想コンテナー (unordered_map) は、erase(remove_if) パラダイムでは機能しません。一般的な方法は、ループに戻ることです。

uom は std::unordered_map です

for(auto it = uom.begin() ; it!=uom.end(); ){
    if(it->second->toErase()) {
        delete it->second; // omit delete if using std::unique_ptr
        fpc.erase(it++);
    }else{
        ++it;
    }
}

//スコット・マイヤーズ有効STL pg45による

これは可能な限り効率的ですか?erase(remove_if) パラダイムのようなものを使用してこれを行うためのより良い方法があるはずですが、それは unordered_map で機能するはずです (連想コンテナーは「再注文」できないため、remove_if アルゴリズムがサポートされていないことを理解しています) . これは本当に、述語を使用して unordered_map からエントリを消去する最良の方法ですか? 助言がありますか?

前もって感謝します。

4

1 に答える 1

0

それは可能な限り効率的です。より便利なものが必要な場合は、boost のerase_ifテンプレートを使用できます -こちらを参照してください。 unordered_map各バケット内のノードのリンクされたリストを維持するため、それらを消去するのは安価です. の連続したメモリの使用にremove-if type適した「圧縮」の必要はありません。std::vector

于 2015-04-06T09:35:42.810 に答える