6

以下のコードでは、行のタイトルにエラーが発生しています

while((*(It2 + code)).exists){


void locatetohashtable(std::list<Element> elist,
                       int *m,std::list<Element>& table,
                       std::list<std::string>& keylist )
{        
    std::list<Element>::iterator It2=table.begin();
    int i=0;
    int k=0;
    std::list<Element>::iterator It;
    for(It = elist.begin(); It != elist.end(); ++It)
    {
        int code=hash_func(stringIntValue((*It).name),*m,i);
        while((*(It2 + code)).exists){
            i++;
        }
        table.insert(*(It2+i), (*It));
        keylist.insert(keylist.begin(),(*It).name);
        k++;
    }
}

同じエラーが発生していません++It

問題は何ですか?

4

4 に答える 4

12

は双方向であるためiteratorstd::listをサポートしていません+(int)。サポートされている移動操作は++とのみ--です。

于 2012-05-12T13:39:32.280 に答える
10

これは、std::listの iterators が双方向の iteratorsであるため、実行しようとしている加算操作をサポートしていないためです。実際には、リストはランダムアクセスを提供しないため、効率的な操作として実装できないためです。そのため、最初のイテレータからターゲットイテレータまで 1 つずつインクリメントする必要があります。設計上の決定は、非効率的な操作を提供しないことです。

std::advanceorを使用std::nextして独自のインクリメント ループを作成しないようにすることもできますが、内部では段階的にインクリメントされます。

于 2012-05-12T13:39:41.890 に答える
4

std::list+イテレータはランダムアクセスではなく双方向のみであるため、演算子を使用してそれらを進めることはできません。std::next(C++11) またはstd::advance代わりに使用します。

于 2012-05-12T13:39:39.747 に答える
2

これは「コンセプト」の問題です。

Aは効率的に前方および後方listにのみトラバースできるため、その反復子は双方向反復子の概念をモデル化します。

を使用して、イテレータを一度に複数の位置に移動できますがstd::advance、効率的ではありません。

または、リストの代わりにvectororを使用するように変更できます。dequeこれらは Random Access コンテナーであるため、反復子は加算と減算を効率的にサポートします。

于 2012-05-12T13:41:02.590 に答える