在C++中迭代向量

Iterating a Vector in C++

本文关键字:向量 迭代 C++      更新时间:2023-10-16

因此,根据我发现的其他示例,我相信这将是迭代m_vect的正确代码:

for(vector<T>::iterator it = m_vect.begin(); it != m_vect.end(); ++it)

但是,在尝试编译时,我在该行收到以下错误:

heap.h:167:6: error: need ‘typename’ before ‘std::vector<T>::iterator’ because ‘std::vector<T>’ is a dependent scope

就像我说的,我从另一段代码中复制并改编了这一行,所以我真的不确定我做对了什么,做错了什么。有什么见解吗?

澄清一下,这是在模板函数中,我已经声明了"模板"。 m_vect 是向量类型。啊,我不知道如何正确显示小于和大于

...

值得庆幸的是,在 C++11 中,您可以让编译器弄清楚。 编译器已经知道m_vect是什么,所以你可以告诉它:

for (auto it= m_vect.begin(); ( it != m_vect.end()) ; ++ it ) { }

但是等等,还有更多。 在 c++11 中,您甚至可以在 m_vect 中迭代所有内容

for (auto it : m_vect ) { }

你能说我认为在 C++03 中进行迭代是疯狂的,我在现实生活中从未见过任何人这样做,而在 C++11 中它要好一千倍吗?

>这似乎是在模板函数中,vector<T>::iterator是一个依赖于模板参数T的类型。 由于模板可以专门用于任何不同类型的唯一定义,因此编译器无法确定,直到模板实际实例化,vector<T>::iterator是类型还是静态成员。 如果它是一个静态成员,这在语法上没有任何意义:

for(vector<T>::iterator it = m_vect.begin(); it != m_vect.end(); ++it)

你需要做的是告诉编译器vector<T>::iterator是一种类型。 为此使用typename

for(typename vector<T>::iterator it = m_vect.begin(); it != m_vect.end(); ++it)

如果您阅读错误,您可以看到这正是编译器告诉您的内容。

T必须是实际类型。它应该是存储在向量中的任何内容的类型。您的for循环看起来正确。你在某个地方宣布m_vect。迭代器需要与您声明m_vect相同的时间(当然还有::iterator(。

这是编译器现在更好地执行的内容。

当您使用从模板派生的内容时,您必须通过添加 typename 来标记它是否被用作类型。然后,如果编译器知道(出于某种疯狂的原因(vector<T>::iterator是一个方法,它可以立即标记错误,而不是进入未定义的行为。

因此,只需添加typename,如消息所述:

for(typename vector<T>::iterator it = m_vect.begin(); it != m_vect.end(); ++it)

如果你有足够现代的编译器,你可以用auto替换vector<T>::iterator

否则,找到正确的类型来替换矢量的T