我有一个看起来像这样的函数:
void myclass::myfunc()
{
int i;
for( std::vector<Foo>::iterator it = var.begin(), i = 0; it < var.end(); it++, i++ )
{
/* ... */
}
}
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
无法转换
int为std::_Vector_iterator<>
这段代码有什么问题?
tem*_*def 19
问题在于for循环的这一部分:
std::vector<Foo>::iterator it = var.begin(), i = 0
Run Code Online (Sandbox Code Playgroud)
C++不是将它解释为两个以逗号分隔的语句,而是将其解释为名为it迭代器的变量的变量声明,以及作为i迭代器并初始化为0的变量的新声明.错误是因为您无法初始化一个vector迭代为0.
要解决这个问题,你需要在循环之外提升定义:
int i = 0;
std::vector<Foo>::iterator it = var.begin();
for(; it < var.end(); it++, i++ )
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
或者i在循环外部移动初始化:
int i = 0;
for( std::vector<Foo>::iterator it = var.begin(); it < var.end(); it++, i++ )
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
不过,还有最后一个选择.如果你需要跟踪你正在查看的向量中的索引,你可以考虑只使用count for循环(没有迭代器),或只使用迭代器并使用迭代器减法来恢复索引:
for (auto it = var.begin(); it != var.end(); ++it) {
// current position is it - var.begin();
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
小智 11
你可以这样做:
int i = 0;
for( std::vector<int>::iterator it = v.begin(); it < v.end(); ++it, ++i){}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4702 次 |
| 最近记录: |