std :: list :: clear会使std :: list :: end iterator失效吗?

时间:2013-02-01 13:07:56

标签: c++ visual-studio-2012 stl stdlist

检查此代码:

#include "stdafx.h"
#include <list>

int _tmain(int argc, _TCHAR* argv[])
{
    std::list<int> mylist;
    mylist.push_back(1);
    std::list<int>::iterator i = mylist.end();
    if( i == mylist.end() )
        printf( "end is end\n" );

    mylist.clear();
    if( i == mylist.end() )
        printf( "never get here because Microsoft seems to "
                "think the iterator is no longer safe.\n" );

    return 0;
}

现在,根据cplusplus.com这不应该是一个问题,在发布模式下,我认为这很好,并没有真正导致任何问题,但调试变得不可能,因为这只是保释而不让我继续。有什么指针吗?

3 个答案:

答案 0 :(得分:11)

其他答案指出,一般情况下,当容器被清除时,您不能依赖容器的过去迭代器保持有效。但是,列表的过去迭代器应该保持有效:

  

C ++ 11 23.3.5.4/3 效果:仅使迭代器和对已擦除元素的引用无效。

过去的结尾迭代器不引用任何元素,因此不应该失效。

答案 1 :(得分:4)

从C ++ 11,表100(序列容器要求):

  

clear() [...]可能会使过去的迭代器无效。

std::list当然是一个序列容器模板(23.3.5.1/2):

  

列表满足容器的所有要求,可逆容器(在23.2中的两个表中给出),的序列容器,包括大多数可选的序列容器要求(23.2。 3),以及分配器感知容器(表99)。例外是operator []和成员函数,未提供。此处提供的描述仅适用于列表中未在其中一个表中描述的操作或有其他语义信息的操作

答案 2 :(得分:-2)

这实际上是无效的。 迭代器仅在当前状态容器上有效。 添加或删除项目后,迭代器将不再有效。

您链接的文章并未说明您的操作是否有效。他们在清除之后得到一个新的迭代器。

它未在发布代码中显示的原因是因为禁用了调试问题的调试。