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

时间:2016-02-27 09:53:19

标签: c++ dictionary

我是初学者。假设我创造了

 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代码工作。

2 个答案:

答案 0 :(得分:3)

首先,map.end():

  

返回一个迭代器,引用map中的past-the-end元素   容器

past-the-end元素是一个虚拟元素(也就是说,它实际上不存在)。它表示地图的最后一个有效元素之后的元素。

如果你问,为什么是虚拟元素? map.end()实际上不应该表示最后一个元素吗?

这是因为涉及像mapsetvector等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;你可能会想。