【问题标题】:"iterator cannot be defined in the current scope" error“无法在当前范围内定义迭代器”错误
【发布时间】:2021-10-09 07:20:06
【问题描述】:

我是一名新手 C++ 程序员,通过一个简单的问题将 name-and-score 对一起打印出来。在这里,我使用std::unordered_set 作为名称,使用向量作为分数(接受重复的分数,但不接受名称),效果很好。

但是有一点让我对结果感到困惑,那就是如果我尝试在 for 循环中初始化迭代器,编译器会给我一个错误提示

迭代器“不能在当前范围内定义。”

这给出了错误:

for (int i = 0, std::unordered_set<std::string>::iterator it = names.begin();
                                                i < names.size(); i++, it++)
{
    std::cout << *it << ", " << scores[i] << '\n';
}

但移到循环之外,它工作正常:

std::unordered_set<std::string>::iterator it = names.begin();
for (int i = 0; i < names.size(); i++, it++)
{
    std::cout << *it << ", " << scores[i] << '\n';
}

这里为什么必须在循环外初始化迭代器?抱歉这个简单的问题,我已经在其他地方搜索过,但没有找到明确的答案。

【问题讨论】:

  • 你只能在for的第一部分声明相同类型的变量,所以要么是迭代器,要么是整数。
  • 无关,但你应该使用pre-increment whenever dealing with iterators,所以++it(对于整数,使用i++++i 不会造成太大差异。)这是因为, std::unordered_set&lt;std::string&gt;::iterator 是一个类,因此 it++ 可能会在每次迭代时创建无用的副本,这在大多数情况下可能不相关,或者如果编译器足够聪明,编译器可能会将其优化掉。但是,作为一种好的做法,您仍然应该更喜欢 ++it 而不是 it++
  • 啊,那是我遗漏的部分。我没有意识到变量必须是相同的类型。这是一个有见地的线程,InQusitive——我没有考虑过使用 pair 或者特别是使用 {} 创建一个单独的范围。还要感谢 Ruks 关于预增量的建议!

标签: c++ for-loop iterator initialization unordered-set


【解决方案1】:

在 C++ 中for-loop

for ( declaration-or-expression(optional) ; declaration-or-expression(optional) ; expression(optional) )
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

初始化语句

  • 表达式语句(可能是空语句“;”)
  • 简单声明,通常是带有初始化程序的循环计数器变量的声明,但它可以声明任意多个变量 请注意,任何 init 语句都必须以分号结尾;,这就是为什么它经常被非正式地描述为表达式或后跟分号的声明。

因此,您可以声明相同类型的变量;例如:

for (int i = 0, j = 1; ... ; i++, j++) {...}
     ^^^^^^^^^^^^^^^^

初始化您之前声明的任何类型的变量。例

std::unordered_set<std::string>::iterator it;
int i;
for (it = names.begin(),  i = 0; i < names.size(); i++, it++) { ... }
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^

因此,您的尝试失败了。

【讨论】:

    猜你喜欢
    • 2014-08-23
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2013-07-08
    • 1970-01-01
    相关资源
    最近更新 更多