C++ 向向量显示迭代器

C++ 向向量显示迭代器,c++,vector,cout,C++,Vector,Cout,我正在做一个项目,在这个项目中,我把一个枚举放到一个向量中。我想知道如何从向量中获得这样的功能 for(int ii = 0; ii < thing.getSize(); ii++){ cout << "thing(" << ii << ") = " << toString(thing[ii]) << endl; } 我试过5种不同的方法,但似乎都不管用。我已经通读了MSDN vector::end似乎是最有用的,直到它

我正在做一个项目,在这个项目中,我把一个枚举放到一个向量中。我想知道如何从向量中获得这样的功能

for(int ii = 0; ii < thing.getSize(); ii++){
    cout << "thing(" << ii << ") = " << toString(thing[ii]) << endl;
}
我试过5种不同的方法,但似乎都不管用。我已经通读了MSDN vector::end似乎是最有用的,直到它说操作符Try:

尝试:


迭代器的行为非常类似于指针:它们指示值的位置,您需要取消对它们的引用以获得值:

std::cout << *ii;

迭代器的行为非常类似于指针:它们指示值的位置,您需要取消对它们的引用以获得值:

std::cout << *ii;

正确的通用方法是

for(std::vector<int>::const_iterator ii=things.begin(); 
         ii != things.end(); ++ii)
{            
    std::cout << "thing(" 
              << std::distance(things.begin(), ii) 
              << "): " << *ii << std::endl;
}
是通过取消对迭代器的引用并使用std::distance来获取从开始到结束的距离

此外,通常认为导入整个名称空间是不好的,最好使用显式using语句,或者在名称空间中使用前缀类型

对于迭代器,通常最好使用前缀增量运算符


另外,除非您正在进行一些有趣的格式化,否则无需对int应用“toString”。因为它定义了一个流运算符。

正确的通用方法是

for(std::vector<int>::const_iterator ii=things.begin(); 
         ii != things.end(); ++ii)
{            
    std::cout << "thing(" 
              << std::distance(things.begin(), ii) 
              << "): " << *ii << std::endl;
}
是通过取消对迭代器的引用并使用std::distance来获取从开始到结束的距离

此外,通常认为导入整个名称空间是不好的,最好使用显式using语句,或者在名称空间中使用前缀类型

对于迭代器,通常最好使用前缀增量运算符

另外,除非您正在进行一些有趣的格式化,否则无需将“toString”应用于int。因为它定义了一个stream操作符。

事情必须声明为:

vector < int > things;
然后像这样迭代:

for ( vector < int >::iterator i = things.begin(); i != things.end(); ++i )
{
    cout << "things( " << ( i - things.begin() ) << " ): " << toString( *i ) << endl; 
}
必须声明:

vector < int > things;
然后像这样迭代:

for ( vector < int >::iterator i = things.begin(); i != things.end(); ++i )
{
    cout << "things( " << ( i - things.begin() ) << " ): " << toString( *i ) << endl; 
}

东西是什么类型的?此外,循环中每个步骤的值将以*ii为单位。ii指向向量中的当前位置。如果你需要显示循环计数器,你需要另一个变量来表示另一个int,你可以在for循环中与ii一起递增。我将尝试单独的计数器,迭代器不是索引,它更像指针。事情[ii]完全错了,使用*ii。打印出迭代器是没有意义的,它没有对最终用户有用的信息,就像指针一样。第764行没问题,我不知道编译器为什么会抱怨。试着用一个10行的程序来演示同样的错误。如果你想用一个向量::迭代器来迭代东西,东西必须声明为:vector东西。@Yaniro解决了这个问题。写一个答案,我会+1,并接受什么类型的东西?此外,循环中每个步骤的值将以*ii为单位。ii指向向量中的当前位置。如果你需要显示循环计数器,你需要另一个变量来表示另一个int,你可以在for循环中与ii一起递增。我将尝试单独的计数器,迭代器不是索引,它更像指针。事情[ii]完全错了,使用*ii。打印出迭代器是没有意义的,它没有对最终用户有用的信息,就像指针一样。第764行没问题,我不知道编译器为什么会抱怨。试着用一个10行的程序来演示同样的错误。如果你想用一个向量::迭代器来迭代东西,东西必须声明为:vector东西。@Yaniro解决了这个问题。写一个答案,我将+1,接受我不是在int上做toString我是在enum上做toString然后指向语句中的问题关于包含整个名称空间它取决于编译器一些编译器会主动查找名称空间中所有需要的类/成员,并且只包含这些类/成员,然后其他的将包括一切。更不用说,在大多数情况下,名称空间的大部分重量都很轻,只有在使用多个名称空间(共享名称或成员)时,才真正不适合包含整个名称空间。根据标准,使用名称空间不会影响编译器。使用名称空间与将当前名称空间与上导入的名称空间合并相同,如果当前名称空间是全局名称空间,那么您首先就已经放弃并否定了NAEMSPACE的好处。我不是在int上执行toString,而是在enum上执行toString,然后指向语句中关于包含整个名称空间的问题它取决于编译器一些编译器将积极查找所有需要的名称空间中的类/成员,并且仅包含这些类/成员,然后其他类/成员将包含所有内容。更不用说名称空间在大多数情况下都是轻量级的,这也是我唯一一次
包含一个完整的名称空间是非常糟糕的,因为当您使用多个名称空间时,共享名称或成员不是标准规定的使用名称空间不支持编译器。使用名称空间与合并当前名称空间和导入的相同,如果当前名称空间是全局名称空间,那么首先您已经使用并否定了NAEMSPACE。确定更改向量迭代器的类型后,它确实起作用。忽略lastok更改向量迭代器的类型后,它确实起作用。忽略最后一个选项如果您使用的是不同的类型(如枚举),则会声明向量内容;,然后,当声明迭代器时,它将是vector::iterator Alternative,如果您使用的是不同的类型,如枚举,则会声明vector things;,然后,当声明迭代器时,它将是vector::iterator