在C++中迭代向量
Iterating a Vector in C++
因此,根据我发现的其他示例,我相信这将是迭代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
。
- std::向量迭代器和调整大小/保留的奇怪/有趣行为
- 如何取消引用向量迭代器
- Map中的(字符串的)向量迭代器
- C++将向量迭代器转换为索引
- yaml-cpp到std::向量迭代的怪异行为
- 使用索引与迭代器将向量迭代到倒数第二个元素
- 无法取消引用超出范围的向量迭代器 - 有什么问题?
- 向量迭代器不兼容的错误,用于保存另一个向量的迭代器的向量
- C++向量迭代器nth_element编译错误
- 无法查找值初始化的向量迭代器?
- C++向量迭代:常量 vs. 常量自动 vs. 无常量
- 向量迭代编译为非常不同的指令
- STD ::向量迭代器类型和允许的操作
- 如何通过尺寸未知的2D向量迭代
- 向量迭代器 < 或 !=
- 如何通过共享_ptr向量迭代
- 如何通过向量迭代作为指针
- 通过向量迭代,而其他线程可能会对其进行修改
- 我如何通过C 中的字符串向量迭代
- 向量迭代器在新对象的 push_back() 之后不兼容