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