【发布时间】:2014-02-08 21:45:36
【问题描述】:
考虑以下不完整的sn-p:
for (std::list<CollidableNode*>::iterator it = m_Enemies.begin(); it != m_Enemies.end();it++)
{
//for current position+1 to end loop
for (std::list<CollidableNode*>::iterator jt = it+1; jt != m_Enemies.end();jt++)
{
//do stuff
}
}
这段代码产生了明显的错误,但说明了我正在尝试做的事情,即:在嵌套循环中,将循环的起点设置在列表中的当前位置,再加一个位置,这样就不会重复进行检查。
考虑到列表的大小是高度动态的,每次更新都会检查列表中的项目以删除,并且经常添加新项目,因此删除速度将比向量快。
是否可以将迭代器偏移到所需位置,如果可以,我该怎么做?
提前致谢
【问题讨论】:
-
在 C++11 中,有
std::next;你也可以用 C++03 自己写:template<class FwdIt> FwdIt next(FwdIt i, int n = 1) { std::advance(i, n); return i; } -
“考虑 [...] 会比矢量更快。” 想要速度?措施。 (Hinnant)。另见youtube.com/watch?v=YQs6IC-vgmo
-
为了使 list 更快,您基本上 必须 在迭代之间存储迭代器:即使这样也无法保证。如果你不是,
std::remove_if使得在vector上的删除和迭代比list更快。在某些情况下list更快,但它们很少。