for循环中迭代器声明出错

时间:2011-03-23 15:34:17

标签: c++

void catchlabel()
{
    if(vecs.empty())
        return;
    else
    {
    cout << "The Sizeof the Vector is: " << vecs.size() << endl; 
    cout << "Currently Stored Labels: " << endl;
    /* Error 1 */
for ( int i = 1, vector<string>::iterator it = vecs.begin(); it != vecs.end(); ++it , i++) 
             cout << i << ". "<< *it << endl;
            cout << endl;
    }
}

我收到以下错误:

1&GT;错误C2146:语法错误:在标识符'it'

之前缺少','

如何解决这个问题?

5 个答案:

答案 0 :(得分:8)

您不能在for循环的初始语句中声明多个类型的项,就像您不能将int i = 1, vector<string>::iterator it = vecs.begin();视为独立语句一样。你必须在循环之外声明其中一个。

由于C语言你从来没有能够在一个语句中声明不同类型的多个变量(虽然指针是一个相当奇怪的例外):

int i, double d;  /* Invalid */

int i, j; /* Valid */

此行为由C ++继承,并适用于for循环中的每个语句以及独立语句。

答案 1 :(得分:1)

您的for循环错误。您不能在for的初始化部分声明不同类型的变量!

这样做:

int i = 1; 
for (vector<string>::iterator it = vecs.begin(); it != vecs.end(); ++it , i++) 
{
      cout << i << ". "<< *it << endl;
}

或许,你会喜欢这个:

for (size_t i = 0 ;  i < vecs.size(); ++i ) 
{
      cout << (i+1) << ". "<< vecs[i] << endl;
}

答案 2 :(得分:1)

您不能在for循环的“init”部分声明两种不同类型的变量。将“i”(或“it”)的声明移到循环外部。

答案 3 :(得分:1)

你可以使用好的技巧不让你的迭代器超出范围:

void catchlabel()
{
    if(vecs.empty())
        return;
    else
    {
    cout << "The Sizeof the Vector is: " << vecs.size() << endl; 
    cout << "Currently Stored Labels: " << endl;
    /* Error 1 */
    {
    vector<string>::iterator it = vecs.begin()
    for ( int i = 1; it != vecs.end(); ++it , i++) 
             cout << i << ". "<< *it << endl;
            cout << endl;
    }
    }
}

我会说,如果你需要操作这两个元素及其索引,那么在'for'循环中使用索引更简单,而不是迭代器。

答案 4 :(得分:1)

您无需专门计算元素,您可以随时计算vecs.begin()的距离:

void catchlabel()
{
    if(!vecs.empty())
    {
        cout << "The Sizeof the Vector is: " << vecs.size() << endl; 
        cout << "Currently Stored Labels: " << endl;
        for (vector<string>::iterator it = vecs.begin(); it != vecs.end(); ++it)
            cout << (it - vecs.begin() + 1) << ". "<< *it << endl; 
        cout << endl;
    }
}