[英]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.