当前位置: 首页 > 面试题库 >

在VS,UNIX / Linux中删除STL迭代器后,该怎么办?

葛景龙
2023-03-14
问题内容

请考虑以下情形:

map(T,S*) & GetMap(); //Forward decleration

map(T, S*) T2pS = GetMap();

for(map(T, S*)::iterator it = T2pS.begin(); it != T2pS.end(); ++it)
{
    if(it->second != NULL)
    {
        delete it->second;
        it->second = NULL;
    }
    T2pS.erase(it);
    //In VS2005, after the erase, we will crash on the ++it of the for loop.
    //In UNIX, Linux, this doesn't crash.
}//for

在我看来,在VS2005中,在“擦除”之后,迭代器将等于end(),因此在尝试增加它时会崩溃。此处介绍的行为之间,编译器之间是否真的存在差异?如果是这样,“擦除”之后的迭代器等于UNIX
/ Linux中的什么?

谢谢…


问题答案:

是的,如果您删除一个迭代器,则该迭代器将获得所谓的 singular value
,这意味着它不再属于任何容器。您不能再递增,递减或读出/写入它。进行该循环的正确方法是:

for(map<T, S*>::iterator it = T2pS.begin(); it != T2pS.end(); T2pS.erase(it++)) {
    // wilhelmtell in the comments is right: no need to check for NULL. 
    // delete of a NULL pointer is a no-op.
    if(it->second != NULL) {
        delete it->second;
        it->second = NULL;
    }
}

对于在擦除一个迭代器时可能使其他迭代器无效的容器,请erase返回下一个有效迭代器。然后你用

it = T2pS.erase(it)

这就是std::vectorand的工作方式std::deque,但std::mapor 却没有std::set



 类似资料:
  • 本文向大家介绍请你来说一说STL迭代器删除元素?相关面试题,主要包含被问及请你来说一说STL迭代器删除元素?时的应答技巧和注意事项,需要的朋友参考一下 这个主要考察的是迭代器失效的问题。1.对于序列容器vector,deque来说,使用erase(itertor)后,后边的每个元素的迭代器都会失效,但是后边每个元素都会往前移动一个位置,但是erase会返回下一个有效的迭代器;2.对于关联容器map

  • 问题内容: 我花了半个小时才意识到问题出在哪里(过滤器返回的迭代器在到达第二个函数调用时已经耗尽了)。如何以最Pythonic /规范的方式重写它? 另外,除了获得更多经验之外,我还可以采取哪些措施避免此类错误?(坦率地说,我不喜欢这种语言功能,因为这些类型的错误易于制造且难以捕获。) 问题答案: 您可以简单地通过调用将迭代器转换为元组 但是我会将该过滤器重写为列表理解,看起来像这样

  • 我在一次面试中被问到使用迭代器比使用< code>for循环有什么好处或者使用< code>for循环比使用迭代器有什么好处? 有人能回答这个问题吗?

  • 问题内容: 我想到了一个并发问题( 在Solaris中 ),如果在读取某人时尝试删除同一文件会发生什么。我有一个关于 Solaris / Linux中 文件存在的查询。假设我有一个文件test.txt,已经在vi编辑器中将其 打开 ,然后打开了一个重复的会话并 删除了 该文件,但是即使删除了该文件,我仍然可以读取该文件。所以这是我的问题: 我在读取时是否需要考虑任何 锁定 机制,所以没有人能够在读

  • 问题内容: 我需要编写一个简单的函数,该函数将删除包含类对象的所有条目。我编写了函数,但是如果的大小大于1 ,则该函数将不起作用。 编辑#1 错误消息如下: 问题答案: 该代码无法编译。什么啊 无论如何,如果要在迭代时删除元素,则必须使用迭代器的remove方法进行操作: 不过,您的方法可以做到。更直接,更有效。

  • AFAIK,有两种方法: 迭代集合的副本 使用实际集合的迭代器 例如, 而且 有没有理由偏爱一种方法而不是另一种方法(例如,由于可读性的简单原因而偏爱第一种方法)?