我正在编写一个应用程序,我在其中绘制了几个图像,如下所示:
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位置? (所以这是一个关于使用迭代器的问题)
亲切的问候, 波吕克斯
答案 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;指数。至少有两种方式:
-
用于随机访问迭代器(即i - container.begin()
)std::distance
(即std::distance(containter.begin(), i)
)。这是一个更“通用”的解决方案,并且由于专业化而在随机访问迭代器情况下与-
执行相同的操作,但是会产生可怕的性能影响但是,我不建议使用其中任何一个,因为它会混淆代码(并且可能无法使用)。相反,正如其他人所说,使用额外的计数器。在需要时使用索引没有“错误”,而更喜欢迭代器是帮助编写“通用”代码的指南,因为您可以将算法应用于不同的容器或容器的子集,等
答案 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,就像我的例子一样。