0

const_iterator と iterator のみの使用についての質問です。より具体的には、distance() を使用します。以下は、ユーザーが (アプリケーションの前の方で) 入力した "fav_games" のリストを作成する基本的なコードです。番号付きリストを出力するために、ベクトルの「インデックス」も削除したかったのです。

部分コード:

int main()
{
    vector<string> fav_games;
    vector<string>::const_iterator iter; // const_iterator no worky with "distance()"

    if (fav_games.size() > 0)  {
        cout << "\n\nCurrent game list: \n";
        for (iter = fav_games.begin(); iter != fav_games.end(); ++iter) 
        {
            cout << distance(fav_games.begin(), iter) << ". " << *iter << endl;
        }
    }

    return 0;
}

私の質問は、「const_iterator」が機能しない理由です。代わりに「iterator」を使用する必要があります。その背後にある「理論」を探しています。"distance()" は "const_iterator" ではなく "iterator" を期待しているように見えます。..どうして?

「const_iterator」を使用した場合のコンパイルエラーを参照してください。

エラー 1 エラー C2782: 'iterator_traits<_Iter>::difference_type std::distance(_InIt,_InIt)': テンプレート パラメーター '_InIt' があいまいです z:\micah\c++\favgames\favgames\favgames.cpp 49 1 favgames

ありがとう!

4

1 に答える 1

1

代わりにこれを試してください:

vector<string>::const_iterator b, iter, e;

if (fav_games.size() > 0)  {
    cout << "\n\nCurrent game list: \n";
    for (b = fav_games.begin(), iter = b, e = fav_games.end(); iter != e; ++iter) 
    {
        cout << distance(b, iter) << ". " << *iter << endl;
    }
}

distanceconst_iterator2 つのインスタンスまたは 2つのインスタンスで問題はありませんiterator。あなたの間違いはそれらを混ぜ合わせたことです。

それでも、O(n)電話をかけるのdistanceはクレイジーです。カウンターを使用するだけです:

vector<string>::const_iterator iter, e;
size_t i;

if (fav_games.size() > 0)  {
    cout << "\n\nCurrent game list: \n";
    for (i = 0, iter = fav_games.begin(), e = fav_games.end(); iter != e; (++iter), (++i)) 
    {
        cout << i << ". " << *iter << endl;
    }
}

C++11 以降では、もちろんさらに一歩進んで、イテレータの明示的な使用をまったく避けることができます。

if (fav_games.size() > 0) {
    int i = 0;
    cout << "\n\nCurrent game list: \n";
    for (const string& game : fav_games) 
    {
        cout << (i++) << ". " << game << endl;
    }
}
于 2014-12-14T22:10:05.187 に答える