簡體   English   中英

std :: list :: clear會使std :: list :: end iterator失效嗎?

[英]Does std::list::clear invalidate std::list::end iterator?

檢查此代碼:

#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,這不應該是一個問題,在發布模式下,我認為這很好,並沒有真正引起任何問題,但調試變得不可能,因為這只是保釋而不讓我繼續。 有什么指針嗎?

其他答案指出,通常,當容器被清除時,您不能依賴容器的過去迭代器保持有效。 但是,列表的過去結束迭代器確實應該保持有效:

C ++ 11 23.3.5.4/3 效果:僅使迭代器和對已擦除元素的引用無效。

過去的結束迭代器不引用任何元素,因此不應該失效。

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

clear() [...]可能使過去的迭代器無效。

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

清單滿足所有的容器要求的可逆容器(23.2在兩個表中給出)的, 序列容器 ,包括大多數的可選序列容器的要求(23.2.3)和分配器感知容器(表99)。 例外是operator []和成員函數,未提供。 這里僅提供對列表中未在這些表之一中描述的操作或對存在附加語義信息的操作的描述。

這實際上是無效的。 迭代器僅在當前狀態容器上有效。 添加或刪除項目后,迭代器不再有效。

您鏈接的文章沒有說明您正在做什么是有效的。 清除后,它們會得到一個新的迭代器。

它沒有出現在發布代碼中的原因是因為禁用了解決問題的調試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM