在C ++中如何获得使用迭代器时的循环次数?

时间:2010-06-12 18:12:44

标签: c++ iterator positioning counter

我正在编写一个应用程序,我在其中绘制了几个图像,如下所示:

void TimeSlice::draw(float fX, float fY) {
list<TimeSliceLevel*>::iterator it = levels.begin();
float level_x = x;
float level_y = y;
while(it != levels.end()) {
    (*it)->draw(level_x,level_y);
    level_y += (*it)->height;
    ++it;
}

}

虽然这有点不正确。我需要在一个X上定位TimeSliceLevel *。当我 得到for(int i = 0; i < slices.size(); ++i)循环,我可以使用x = i * width。虽然我使用的是迭代器,因为我多次被告知这是一个很好的编程:&gt;我想知道迭代器是否有一个“索引”数字,我可以用来计算新的X位置? (所以这是一个关于使用迭代器的问题)

亲切的问候, 波吕克斯

6 个答案:

答案 0 :(得分:7)

它们没有,因为除了从有序的索引列表的开头到结尾循环之外,迭代器还可以用于其他目的。您需要单独跟踪索引并在每次传递时递增:

list<TimeSliceLevel*>::iterator it;
int index;

for(it = levels.begin(), index = 0; it != levels.end(); ++it, ++index) {
    ...
}

答案 1 :(得分:3)

不,它没有。如果需要整数索引,请使用for循环。尽管一些迭代器极端分子会让你相信,for循环仍然在C ++代码中占有一席之地。

答案 2 :(得分:2)

可以从iterator转到 - &gt;指数。至少有两种方式:

  1. -用于随机访问迭代器(即i - container.begin()
  2. 使用std::distance(即std::distance(containter.begin(), i))。这是一个更“通用”的解决方案,并且由于专业化而在随机访问迭代器情况下与-执行相同的操作,但是会产生可怕的性能影响
  3. 但是,我不建议使用其中任何一个,因为它会混淆代码(并且可能无法使用)。相反,正如其他人所说,使用额外的计数器。在需要时使用索引没有“错误”,而更喜欢迭代器是帮助编写“通用”代码的指南,因为您可以将算法应用于不同的容器或容器的子集,等

答案 3 :(得分:1)

对于某些迭代器类型,只需从初始迭代器中减去当前迭代器:

index = it - levels.begin()

由于这对std :: list迭代器不起作用,只需使用变量显式跟踪索引,如上面的答案中所述。使用迭代器和容器的好处不会丢失。您正在添加容器未提供的要求。

答案 4 :(得分:0)

您必须编写类似

的内容
size_t index = 0;
for (list<...>::const_iterator it = y.begin(); it != y.end(); ++it) {
   // Do your actions based on `index`
   ++index;
}

而且,这有时合适。

另一方面,您可以重构(重新计划)您的应用程序,以便您的实际绘图循环不必创建所有x += something, y += something2, ...,而是按以下方式执行:

foreach (Level* level, list) {
    level->draw(backend);
}

它有时可能很棘手,但在我看来,如果您的应用程序增长到“big”,这种方法可以为您节省大量时间。

答案 5 :(得分:0)

您只能使用随机访问迭代器。如果它是一个随机访问迭代器,你可以从开始迭代器中减去迭代器来获得索引(不保留单独的int索引变量)。

for (vector<int>::const_iterator cit = v.begin(); cit != v.end(); ++cit)
{
   cout << "This is element no: " << cit - v.begin() << endl;
}

在您的示例中,遗憾的是您将无法执行此操作,因为您使用的是std :: list,它只是一个双向迭代器。使用std :: vector,就像我的例子一样。