4

C++11 機能を使用してハッシュ クラスを実装しようとしています。学校の課題なので、stl のハッシュを再利用していません。私はこれをやろうとしています:

for(auto &h : {H1[hash_func(n1, val)], H2[hash_func(n2, val)]}) {
    for(auto &x : h) {
        if(x == val) {
            swap(x, h.back());
            h.pop_back();
        }
    }
}

H1およびH2タイプはvector<T>*です。これをコンパイルしようとすると、理解できない厄介な構文エラーが発生します。の代わりに試しfor(auto &h : {H1, H2})て使用すると、機能します(明らかに間違っていますが)。どうすればこれを修正できますか? (または、少なくとも同じことを 2 回書くよりもエレガントな方法で実装します)h[hash_func(n1, val)]h

4

2 に答える 2

4

あなたが投稿したエラーメッセージから、エラーはこの一節とはまったく関係がなく、スワップしようとしていることが原因です。その理由は、初期化子リストでのアクセスがベクトルをコピーしているため、参照に暗黙的にバインドされた一時オブジェクトになってしまうためです。結果として、ベクトルのメンバーも同様です。const intH1[…]constconst

さらに悪いことに、このエラーを修正しても、間違った型にアクセスしているため、コードは機能しません。メンバーは次のように初期化されます。

H1 = new vector<T>[n];

H1単一のベクトルへのポインターです。コードでインデックスを使用してアクセスするため、ほとんどの場合、それは望ましくありません。

H1[hash_func(n1, val)]

コードが無効なメモリにアクセスするhash_func以外のものが得られる場合。0

H1とにかくとH2ポインタがあるのはなぜですか? 手動のメモリ管理は使用しないでください。単純なベクトルを使用してください。

于 2013-04-07T10:14:41.610 に答える
0

私はポインターに目を向けることでこれを修正することができました:

for(auto h : {&H1[hash_func(n1, val)], &H2[hash_func(n2, val)]}) {
    for(auto &x : *h) {
        if(x == val) {
            swap(x, h->back());
            h->pop_back();
            break;
        }
    }
}
于 2013-04-07T10:17:07.433 に答える