地图和迭代器(IN)验证

Map and iterator (in)validation

本文关键字:验证 IN 迭代器 地图      更新时间:2023-10-16

我有偶尔需要清洁的map中存储的项目缓存。map::erase无效curr迭代器,因此我想维护next指针,以防curr删除。

问题:如果我 erase curr处的元素,是否无效next?我不相信它可以,但是我想确定我不会错过map::erase中明显的东西)。

以下代码也无法使用error: no match for ‘operator+’ in ‘curr + 1’编译:

typedef map<string, SSL_CTX_ptr> Contexts;
...
Contexts::const_iterator curr, next;
curr = contexts.begin();
while (curr != contexts.end())
{
    if(IsOkToRemove(curr))
    {
        next = curr + 1;
        contexts.erase(curr);
        curr = next;
        continue;
    }
    curr++;
}

问题:如何将next设置为curr之后的元素?

编辑: Kerrek的示例下面是我试图理解的确切情况:

contexts.erase(it++);

erase中,删除了该元素。这意味着呼叫者的迭代器到同一元素在邮寄增量发生之前将无效。因为迭代器是无效的,所以这是我试图在上面尝试curr + 1的原因。这是我要确保next始终有效的原因。

这样:

for (auto it = contexts.begin(); it != contexts.end(); )
{
    if (IsOkToRemove(it)) { contexts.erase(it++); }
    else                  { ++it;                 }
}

由于C 11,您也可以说it = contexts.erase(it);,因为erase已更改以将迭代器返回C 中的删除元素。