我读了map.erase(map.end());删除地图的最后一个元素。但是最后一个元素是什么?它是否基于元素的插入顺序?

I read map.erase(map.end()); deletes the last element of the map.But what's the last element? Is it based in the insertion order of elements?

本文关键字:元素 最后一个 map 是否 于元素 顺序 插入 是什么 删除 erase 地图      更新时间:2023-10-16

我是初学者。假设我创建

 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元素<8,3>。为什么会这样?

仅供参考:我正在为 LRUcache 代码工作。

首先,map.end():

返回引用映射中过去结束元素的迭代器 容器。

Past-the-End 元素是一个虚拟元素(也就是说,它实际上不存在)。它表示紧跟在映射的最后一个有效元素之后的元素。

如果你问,为什么是虚拟元素?map.end()不应该真的意味着存在的最后一个元素吗?

这是因为大多数涉及 C++11 容器(如 mapsetvector 等)的操作都将其操作指定为[ )这意味着每当向任何操作提供范围时,该范围都会被解释为:包含第一个元素,不包含最后一个元素

例如,[2,5)表示必须在 2,3,4 上执行操作。

其次,当你调用mp.erase(element)时,这个element必须是一个有效且可去引用的元素。但是您正在指定它map.end()

mp.erase(mp.end())一定行不通。

回到你的问题,博士:

地图不会保留广告订单记录

因此,从末尾删除意味着删除映射中存在的最后一个元素,按键排序。

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));

应该始终删除带有键" 10 "的对,而不是您可能认为的带有键" 8"的对。