C++ STL矢量与映射擦除
在STL中,几乎所有容器都具有擦除功能。我的问题是在向量中,erase函数返回一个迭代器,指向向量中的下一个元素。映射容器不执行此操作。相反,它返回一个空值。有人知道为什么会出现这种不一致吗?我不知道这是否是答案,但其中一个原因可能是查找下一个元素的成本。遍历映射本身就是“缓慢的”。请参见 Map具有以下重要特性: 在地图中插入新元素 不会使 指向现有元素。删除 映射中的元素也不存在 使任何迭代器无效,但 当然,对于迭代器来说 指向正在创建的元素 删除C++ STL矢量与映射擦除,c++,stl,C++,Stl,在STL中,几乎所有容器都具有擦除功能。我的问题是在向量中,erase函数返回一个迭代器,指向向量中的下一个元素。映射容器不执行此操作。相反,它返回一个空值。有人知道为什么会出现这种不一致吗?我不知道这是否是答案,但其中一个原因可能是查找下一个元素的成本。遍历映射本身就是“缓慢的”。请参见 Map具有以下重要特性: 在地图中插入新元素 不会使 指向现有元素。删除 映射中的元素也不存在 使任何迭代器无效,但 当然,对于迭代器来说 指向正在创建的元素 删除 在擦除时返回迭代器的原因是,您可以在擦除元
在擦除时返回迭代器的原因是,您可以在擦除元素时对列表进行迭代。如果删除项不会使现有迭代器无效,则无需执行此操作。不一致是由于使用了
vector
是对元素进行排序的序列。虽然map
中的元素确实也是根据某种比较标准排序的,但这种排序从结构上看并不明显。从一个元素到下一个元素没有有效的方法(有效=恒定时间)。事实上,在地图上迭代是相当昂贵的;无论是迭代器的创建还是迭代器本身都需要遍历整个树。这不能在O(n)中完成,除非使用堆栈,在这种情况下,所需的空间不再是常量
总而言之,在擦除之后,根本没有便宜的方法返回“下一个”元素。对于序列,有一种方法
此外,罗布是对的。不需要映射返回迭代器。< P>。顺便说一下,用MS VisualStudioC++(Dinkumware Irc)装运的STL提供了一个带有“<代码>擦除< /代码>”函数的映射实现,它将迭代器返回到下一个元素。
他们注意到它不符合标准。
erase
在C++11中返回一个迭代器。这是由于:
表67(23.1.1)说明container::erase(迭代器)返回一个迭代器。表69(23.1.2)指出,除了此要求之外,关联容器还表示container::erase(迭代器)返回void。这不是一个附加;这是对需求的更改,其效果是使关联容器无法满足容器的需求
标准委员会接受了这一点:
LWG同意返回类型应该是迭代器,而不是void。(亚历克斯·斯捷潘诺夫也同意。)
(LWG=图书馆工作组)。关于set的页面也有相同的信息。