检查迭代器是否有效

新手上路,请多包涵

有什么方法可以检查迭代器(无论它来自向量、列表、双端队列……)是否(仍然)可取消引用,即尚未失效?

我一直在使用 try - catch ,但是有更直接的方法吗?

示例:(不起作用)

 list<int> l;
for (i = 1; i<10; i++) {
    l.push_back(i * 10);
}

itd = l.begin();
itd++;
if (something) {
    l.erase(itd);
}

/* now, in other place.. check if it points to somewhere meaningful */
if (itd != l.end())
{
    //  blablabla
}

原文由 huff 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

我假设您的意思是“是一个有效的迭代器”,它没有因容器的更改而失效(例如,插入/擦除到/从向量)。在这种情况下,不,您无法确定迭代器是否(安全地)可解引用。

原文由 Jason Govig 发布,翻译遵循 CC BY-SA 2.5 许可协议

有办法,但很丑……你可以使用 std::distance 函数

  #include <algorithms>
  using namespace std
  auto distance_to_iter = distance(container.begin(), your_iter);
  auto distance_to_end = distance(container.begin(),container.end());

  bool is_your_iter_still_valid = distance_to_iter != distance_to_end;

原文由 aralce 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题