1

次の構造を使用しています。

hash_map<string, list<time_t>>

最初にテキストファイルから読み取った情報をハッシュマップに入力するとき、それらのtime_tリストに要素を挿入することに問題はありません。

hash_t::iterator it = hash.find(origen);

if (it != hash.end())
{
    (*it).second.push_front(fecha);         
}
else
{ 
    list<time_t> lista(1, fecha);
    hash.insert(make_pair(origen, lista));          
}

ご覧のとおり、キー文字列がテーブルにない場合は、time_t値が1つあるリストを作成し、そのペアをテーブルに挿入します。同じキーのアピアランスをたどると、既存のリストにある新しいtime_t要素を押すだけで、正常に機能します。

今は逆のことをしたいと思います。それらのリストの要素を消去します。

hash_t::iterator it = hash.find(origen);            

if (it != hash.end())
{
    list<time_t> lista = (*it).second;  
    list<time_t>::iterator it2 = lista.begin();
    bool found = false;

    while(it2 != lista.end() && !found)
    {
        time_t fecha2 = *it2;           
        if (abs((int) difftime(fecha, fecha2)) <= 2) 
        {
            found = true;   
            lista.erase(it2);
        }
        else ++it2;
    }
}

このコードは、これらのリストから要素を削除していません。

問題は次の行から始まると思います。

list<time_t> lista = (*it).second; 

変数listaには、hash_mapまたはそのコピーから取得できるリストと同じものがありますか?それがコピーである場合、私はそれが機能しない理由を理解していません。しかし、なぜそれが要素の挿入に機能したのか私はまだ理解していません。

(*it).second.push_front(fecha);

私が行っているのと同様のアプローチを使用してリストから要素を消去する方法はありますか、それともhash_mapの構造全体を次のようなものに変更する必要がありますか?

hash_map<string, list<time_t>*>

事前にどうもありがとうございました

4

2 に答える 2

2

コードは、のerase()実際のリストではなく、リストのコピーで動作していますhashmap。これにより、コピーが作成されます。

list<time_t> lista = (*it).second;

代わりに参照を使用してください。

list<time_t>& lista = (*it).second;

コピーが作成されていないため、push_front()は正しく動作します。コードは次のリストにhashmap直接アクセスします。

(*it).second.push_front(fecha);
于 2012-06-21T15:24:48.200 に答える
1

変数listaには、hash_mapまたはそのコピーから取得できるリストと同じものがありますか?

はいlista、コピーです。あなたは割り当てを行っています。

しかし、なぜそれが要素の挿入に機能したのか私はまだ理解していません。

このコードでは、のコピーを使用せず(*it).second、参照を直接使用します。

于 2012-06-21T15:27:22.643 に答える