Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL矢量与映射擦除_C++_Stl - Fatal编程技术网

C++ STL矢量与映射擦除

C++ STL矢量与映射擦除,c++,stl,C++,Stl,在STL中,几乎所有容器都具有擦除功能。我的问题是在向量中,erase函数返回一个迭代器,指向向量中的下一个元素。映射容器不执行此操作。相反,它返回一个空值。有人知道为什么会出现这种不一致吗?我不知道这是否是答案,但其中一个原因可能是查找下一个元素的成本。遍历映射本身就是“缓慢的”。请参见 Map具有以下重要特性: 在地图中插入新元素 不会使 指向现有元素。删除 映射中的元素也不存在 使任何迭代器无效,但 当然,对于迭代器来说 指向正在创建的元素 删除 在擦除时返回迭代器的原因是,您可以在擦除元

在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的页面也有相同的信息。