簡體   English   中英

為什么在 std::deque.erase() 上拋出異常?

[英]Why the exception is thrown on std::deque.erase()?

嘗試通過迭代器從deque中刪除元素時會拋出此錯誤。 使用 VS2017 的錯誤是“無法尋找值初始化的迭代器”。 我想知道為什么會這樣, std::deque不是一個不會使push_front() / push_back()上的迭代器無效的雙向鏈表嗎?

class deque2 {
public:
    bool enqueue(int val) {
        if (mp.find(val) != mp.end()) {
            return false;
        }
        dq.push_front(val);
        mp[val] = dq.begin();
        return true;
    }

    int dequeue() {
        if (dq.size() == 0) {
            return -1;
        }

        int res = dq.back();
        mp.erase(res);
        dq.pop_back();
        return res;
    }

    void erase(int val) {
        auto it = mp.find(val);
        if (it != mp.end()) {
            dq.erase(it->second); // exception 
            mp.erase(val);
        }
    }
private:
    deque<int> dq;
    unordered_map<int, deque<int>::iterator> mp;
};

不是 std::deque 雙向鏈表

不它不是。 文檔中所述

std::deque(雙端隊列)是一個索引序列容器,允許在其開頭和結尾快速插入和刪除。 此外,在雙端隊列的任一端插入和刪除都不會使指向元素的 rest 的指針或引用無效。

重點是我的。 請注意,它表示指針或引用未失效,而不是迭代器。 std::deque::push_front()上的文檔清楚地說明了這一點:

所有迭代器,包括過去的迭代器,都無效。 沒有引用無效。

至於您嘗試實現的邏輯,我建議使用boost::multi_index因為它允許具有不同訪問條件的單個容器,並且您不必保持 2 個容器同步。 文檔可以在這里找到

暫無
暫無

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

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