我是初学者。假设我创造了
map<int, node*> mp;
节点是
struct node{
node *previous;
int key; // I have no idea why there is a key variable in this node
int value;
node *next
};
因此地图具有int键,指向双向链表的节点。
假设我在顺序中插入了以下元素。
<key,(let corresponding node.value element be)>
<5, 1>
<10,2>
<8, 3>
所以双重链表看起来像:
1<->2<->3
现在,如果我想在节点值为2,3的现有节点之间插入新节点。所以我创建了一个新的地图元素。
<key,(let corresponding node.value element be)>
<7, 4>
(新调整的)双向链表看起来像:(根据我的要求)
1<->2<->4<->3
mp.erase(mp.end());删除,为什么?
我写了一个示例程序,其中map元素&lt; 8,3&gt;被删除。为什么会这样?
仅供参考:我正在为LRUcache代码工作。
答案 0 :(得分:3)
首先,map.end():
返回一个迭代器,引用map中的past-the-end元素 容器
past-the-end元素是一个虚拟元素(也就是说,它实际上不存在)。它表示地图的最后一个有效元素之后的元素。
如果你问,为什么是虚拟元素? map.end()
实际上不应该表示最后一个元素吗?
这是因为涉及像map
,set
,vector
等C ++ 11容器的大多数操作都将其操作指定为[ )
,这意味着无论何时为任何操作提供范围,该范围都被解释为:包含第一个元素,最后一个元素不是。
示例,[2,5)
表示必须在2,3,4上执行操作。
其次,当您致电mp.erase(element)
时,此element
必须是有效且可解除引用的元素。但是你要指定map.end()
。
mp.erase(mp.end())
一定不行。
回到你的问题,TL; DR:
地图未记录广告订单。
因此,从末尾删除意味着删除地图中存在的最后一个元素,按键排序。
答案 1 :(得分:2)
map<int, node*> mp;
mp.insert(make_pair(5, nullptr));
mp.insert(make_pair(10, nullptr));
mp.insert(make_pair(8, nullptr));
std::map
在内部按其键排序,默认情况下按升序排序,使用std::less<Key>
。因此,第二个值可能是任何东西都无关紧要。
mp.erase(--mp.end());
// or
mp.erase(std::prev(mp.end(), 1));
应始终使用键&#34; 10
&#34;删除该对,而不是使用键&#34; 8&#34;你可能会想。