纯粹是为了回答您的问题,您可以使用迭代器:
std::vector<char> path;
// ...
for (std::vector<char>::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
如果要在for循环中修改向量的内容,请使用iterator
而不是const_iterator
。
但是还有很多可以说的。如果您只想使用一个答案,可以在这里停止;否则,请继续阅读。
自动(C ++ 11)/ typedef
这不是另一个解决方案,而是对上述iterator
解决方案的补充。如果您使用的是C ++ 11标准(或更高版本),则可以使用auto
关键字来提高可读性:
for (auto i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
但是的类型i
将是非const的(即,编译器将std::vector<char>::iterator
用作的类型i
)。
在这种情况下,您也可以只使用a typedef
(不限于C ++ 11,无论如何都非常有用):
typedef std::vector<char> Path;
Path path;
// ...
for (Path::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
计数器
当然,您可以使用整数类型来记录您在for
循环中的位置:
for(int i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
如果要执行此操作,则最好使用容器的成员类型(如果可用)。std::vector
具有size_type
为此作业要求的成员类型:它是size
方法返回的类型。
// Path typedef'd to std::vector<char>
for( Path::size_type i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
为什么不只是在iterator
解决方案上使用它呢?对于简单的情况,您也可能iterator
会这样做,但要点是,该类是设计用于针对较复杂的对象执行此工作的对象,而该解决方案并不理想。
基于范围的for循环(C ++ 11)
请参阅Jefffrey的解决方案。在C ++ 11(及更高版本)中,您可以使用新的基于范围的for
循环,如下所示:
for (auto i: path)
std::cout << i << ' ';
由于path
是项的向量(显式地std::vector<char>
),所以对象i
是向量的项的类型(即,显式地,它是类型char
)。该对象i
具有一个值,该值是该path
对象中实际项目的副本。因此,i
循环中的所有更改都不会保留下来path
。此外,如果您想强制执行,你不希望能够改变的复制价值的事实,i
在循环中,你可以强制的类型i
是const char
这样的:
for (const auto i: path)
std::cout << i << ' ';
如果您要修改中的项目path
,可以使用参考:
for (auto& i: path)
std::cout << i << ' ';
即使您不想修改path
,如果对象的复制成本很高,您也应该使用const引用而不是按值复制:
for (const auto& i: path)
std::cout << i << ' ';
std :: copy
参见约书亚的答案。您可以使用STL算法std::copy
将向量内容复制到输出流上。如果您愿意的话,这是一个很好的解决方案(此外,它非常有用,不仅在打印矢量内容的情况下)。
std :: for_each
请参阅Max的解决方案。std::for_each
在这种简单情况下,使用可能会显得过头,但是如果您想做的不仅仅是打印到屏幕上,这是一个非常有用的解决方案:使用std::for_each
可以对向量内容执行任何(明智的)操作。
重载ostream :: operator <<
请参阅Chris的答案,它是对其他答案的补充,因为您仍然需要在重载中实现上述解决方案之一。在他的示例中,他for
循环使用一个计数器。例如,这是您可以快速使用约书亚解决方案的方法:
template <typename T>
std::ostream& operator<< (std::ostream& out, const std::vector<T>& v) {
if ( !v.empty() ) {
out << '[';
std::copy (v.begin(), v.end(), std::ostream_iterator<T>(out, ", "));
out << "\b\b]";
}
return out;
}
任何其他解决方案的使用都应该简单明了。
结论
这里介绍的任何解决方案都可以使用。这取决于您和“最佳”代码。比这更详细的内容可能最好留给另一个问题,在这个问题上可以正确地评估利弊。但是,与以往一样,用户的偏好始终会发挥作用:提出的解决方案都没有错,但是对于每个单独的编码器来说,有些解决方案看起来更好。
附录
这是我发布的较早版本的扩展解决方案。由于该帖子一直受到关注,因此我决定对其进行扩展,并参考此处发布的其他出色解决方案。我原来的职位有这样提到,如果此言是在修改里面的矢量打算for
环路,则有提供两种方法std::vector
来访问元素:std::vector::operator[]
不这样做边界检查,并且std::vector::at
其不执行边界检查。换句话说,at
如果您尝试访问向量之外的元素,则不会抛出异常operator[]
。我最初仅添加此评论,是为了提及一些可能有人会知道的有用信息。我现在没有区别。因此,本增编。