【问题标题】:offsetting position of iterator for a std::liststd::list 的迭代器的偏移位置
【发布时间】: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&lt;class FwdIt&gt; 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 更快,但它们很少。

标签: c++ list stl iterator std


【解决方案1】:

std::next 可能是你需要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多