簡體   English   中英

你可以在迭代時更改std :: list嗎?

[英]Can you change a std::list while iterating through it?

在以下函數中,IObserver的Process()函數完全可以嘗試使用this指針的DeleteObserver()從通知列表中刪除自身。

這會導致迭代器地獄(不出意外!),有沒有辦法解決這個問題? 或者我應該仔細看看我的設計?

void cButtonManager::DeleteObserver(IObserver *observer)
{
    list<IObserver*>::iterator iter;
    for (iter = m_ObserverList.begin(); iter != m_ObserverList.end(); ++iter)
    {
        if (*iter == observer)
        {
            // Found the specified observer in the list, delete it
            m_ObserverList.erase(iter);
            return;
        }
    }
}

void cButtonManager::NotifyObservers(void)
{
    list<IObserver*>::iterator iter;
    for (iter = m_ObserverList.begin(); iter != m_ObserverList.end(); ++iter)
    {
        (*iter)->Process(this);
    }
}

例如,假設該列表是訂閱雜志的人的集合,而Process()函數是新雜志問題的交付; 如果雜志最新的問題很糟糕,訂閱者可能希望取消訂閱作為該問題的直接結果。

編輯:

有些人在評論中糾正了我,所以我會改變這個答案。 但不要贊成,因為這是評論者的解決方案,而不是我的解決方案。

(*iter++)->Process();

我不明白你為什么不在這里使用list::remove 這似乎是一個完美的匹配我。

對於NotifyObserver的問題,我不會讓Process執行刪除本身,而是讓它發出信號表明它希望自己從觀察者列表中刪除。 顯而易見:將一個bool從Process返回到signal,然后調用list::erase就可以了。 erase的返回值分配給當前iter

暫無
暫無

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

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