2012-03-15 10 views
9

挿入時(またはそれよりも効率的なもの)に基づいて要素をstd :: mapから消去する必要があります。挿入時に基づいてstd :: mapから要素を削除します

マップには何千もの要素が含まれている可能性があります。時間を保存してマップを繰り返して各要素の時間を確認すると、かなり時間がかかることになります。

誰かが古くなっているときにstd :: mapから要素を消去する方法はありますか?

+1

ブーストマルチインデックスコンテナを見たいかもしれません – PlasmaHH

+1

Old?アクションを実行するための明確な基準が必要です。定義しない限り、Qはかなり方向性がありません。 –

+0

@PlasmaHH yeah boostはこのプロジェクトでは使用できませんでした。 – theAlse

答えて

6

std::map<>タイプには、要素が挿入されたときの概念はありません。これは、キーと値のペアのマッピングを保持する役割しか果たしません。また、挿入順序の概念もないため、相対的なタイプの挿入を提供することさえできません。

要素と要素が挿入された時間との関連付けを追加する必要があります。あなたが望むものがすべて相対的なものであれば、std::queueをマップと組み合わせて使うことができます。マップに挿入するたびに、std::queueにも挿入されます。キューの正面にある要素は背面よりも古いので、相対的な年齢に使用できます

1

キューを使用して、オブジェクトがマップに挿入されるときにポインタを挿入することができます。キュー内の次の項目は最も古い項目です。また、挿入時間が必要な場合は、ペアに格納することもできます。

+0

イテレータはポインタよりも有用かもしれませんが、マップへの挿入や消去の影響を受けません。 http://stackoverflow.com/a/6438087/5987 –

4

かなり近いLRU Cacheに近づいています。

Boost.MultiIndexライブラリは、MRU Cache(Most Recently Used)の例を示しているため、LRUに適合させるのは簡単です。マップに参照して

  • dequeにアイテムを

    • map

    Basicコード:

    は、基本的な考え方は、並列に2つのデータ構造を維持することです

    static double const EXPIRY = 3600; // seconds 
    
    std::map<Key, Value> map; 
    std::deque<std::pair<std::map<Key, Value>::iterator, time_t>> deque; 
    
    bool insert(Key const& k, Value const& v) { 
        std::pair<std::map<Key, Value>::iterator, bool> result = 
        map.insert(std::make_pair(k, v)); 
    
        if (result.second) { 
        deque.push_back(std::make_pair(result.first, time())); 
        } 
    
        return result.second; 
    } 
    
    // to be launched periodically 
    void clean() { 
        while (not deque.empty() and difftime(time(), deque.front().second) < EXPIRY) { 
        map.erase(deque.front().first); 
        deque.pop_front(); 
        } 
    } 
    

    もちろん、これらの構造にはb目的がマルチスレッドコードを取得する場合は同期されます。

  • +0

    ありがとう、私は試してみる非常に良いide。 – theAlse

    関連する問題