我读了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<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 容器(如 map
、set
、vector
等)的操作都将其操作指定为[ )
这意味着每当向任何操作提供范围时,该范围都会被解释为:包含第一个元素,不包含最后一个元素。
例如,[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"的对。
- lower_bound()返回最后一个元素
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 仅显示链表的最后一个元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- std::矢量保存 只推送最后一个元素
- 反转后不返回最后一个元素
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 在 QListView 中显示最后一个元素
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 遍历列表包含排除最后一个元素的内容
- 如何打印第一个和最后一个元素的和,然后打印第二个和倒数第二个元素的总和,依此类推
- C++链表最后一个元素的迭代器?
- 这种获取模板参数包中最后一个元素的方法是否有隐藏的开销?
- 使用 STL 交换堆栈 C++ 中的第一个和最后一个元素
- 查找数组的第一个和最后一个索引,其中 from 和 to 元素的顺序总和最大
- 数组:如何在指定索引之前显示数组的第一个和最后一个元素以及数组元素的差异?