Iterator VS const_iterator,使用distance()

时间:2014-12-14 22:05:48

标签: c++ vector stl iterator const-iterator

只是一个问题,关于使用const_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;
}

我的问题是为什么,&#34; const_iterator&#34;不会工作,我被迫使用&#34; iterator&#34;代替。寻找理论&#39;在它背后。 &#34;距离()&#34;似乎期待和&#34; iterator&#34; - 不是&#34; const_iterator&#34;。 ..Why?

如果我使用&#34; const_iterator&#34;:

,仅供参考编译错误

错误1错误C2782:&#39; iterator_traits&lt; _Iter&gt; :: difference_type std :: distance(_InIt,_InIt)&#39; :模板参数&#39; _InIt&#39;是不明确的z:\ micah \ c ++ \ favgames \ favgames \ favgames.cpp 49 1 favgames

谢谢!

1 个答案:

答案 0 :(得分: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;
    }
}

distance对两个const_iterator个实例或两个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;
    }
}