繁体   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