0

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

我的问题是为什么“const_iterator”不起作用,而我被迫使用“iterator”。寻找它背后的“理论”。“distance()”似乎是期待和“迭代器”——而不是“const_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;
    }
}

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;
    }
}
于 2014-12-14T22:10:05.187 回答