关于C ++:STL向量与地图擦除

关于C ++:STL向量与地图擦除

STL vector vs map erase

在STL中,几乎所有容器都具有擦除功能。 我的问题在向量中,擦除功能返回一个迭代器,该迭代器指向向量中的下一个元素。 地图容器不会执行此操作。 而是返回一个空值。 有人知道为什么会有这种不一致吗?


参见http://www.sgi.com/tech/stl/Map.html

Map has the important property that
inserting a new element into a map
does not invalidate iterators that
point to existing elements. Erasing an
element from a map also does not
invalidate any iterators, except, of
course, for iterators that actually
point to the element that is being
erased.

在擦除时返回迭代器的原因是,以便您可以遍历列表擦除元素。如果擦除项目不会使现有的迭代器无效,则无需执行此操作。


erase在C ++ 11中返回一个iterator。这是由于缺陷报告130:

Table 67 (23.1.1) says that container::erase(iterator) returns an iterator. Table 69 (23.1.2) says that in addition to this requirement, associative containers also say that container::erase(iterator) returns void. That's not an addition; it's a change to the requirements, which has the effect of making associative containers fail to meet the requirements for containers.

标准委员会接受了:

the LWG agrees the return type should be iterator, not void. (Alex Stepanov agrees too.)

(LWG =图书馆工作组)。


不一致是由于使用。 vector是对元素具有排序的序列。虽然map中的元素也确实根据某种比较标准进行了排序,但是这种排序在结构中是不明显的。没有一种有效的方法可以使一个要素进入另一个要素(有效=恒定时间)。实际上,遍历地图非常昂贵;迭代器的创建或迭代器本身都涉及遍历整个树。除非使用堆栈,否则无法在O(n)中完成此操作,在这种情况下,所需空间不再恒定。

总而言之,根本没有廉价的方法可以在擦除后返回" next"元素。对于序列,有一种方法。

此外,Rob是对的。 Map无需返回迭代器。


顺便说一句,MS Visual Studio C ++(Dinkumware IIRC)附带的STL提供了带有erase函数的映射实现,该函数将迭代器返回到下一个元素。

他们确实注意到这不符合标准。


我不知道这是否是答案,但是一个原因可能是定位下一个元素的成本。遍历地图本质上是"缓慢的"。


推荐阅读

    linux运维操作命令?

    linux运维操作命令?,系统,网络,基础,标准,工具,信息,工作,命令,软件,数据,lin

    linux命令行常见操作?

    linux命令行常见操作?,系统,工作,地址,管理,信息,命令,目录,一致,基础,标准,l

    linux清空操作命令?

    linux清空操作命令?,系统,数据,命令,名称,不了,文件夹,文件,环境,回收站,目

    linux安装操作命令?

    linux安装操作命令?,系统,工作,地址,工具,服务,情况,信息,命令,最新,管理,lin

    linux操作系mv命令?

    linux操作系mv命令?,名字,系统,软件,文件,命令,信息,地址,目录,文件夹,源文

    linux操作命令大全图?

    linux操作命令大全图?,工作,地址,系统,信息,命令,目录,控制台,功能,操作,内

    linux操作命令论文?

    linux操作命令论文?,管理,系统,设计,网络,企业,基础,机电设备,技术,发展,机

    linux硬盘擦除命令?

    linux硬盘擦除命令?,数据,系统,工具,管理,可取,位置,电脑,分析,信息,分区,【

    linux操作命令cp?

    linux操作命令cp?,系统,文件,命令,源文件,基本知识,时间,目录,文件夹,选项,

    linux操作命令及用法?

    linux操作命令及用法?,工作,地址,系统,管理,信息,命令,目录,网络,文件,操作,L

    linux基础命令和操作?

    linux基础命令和操作?,工作,地址,基础,命令,管理,标准,系统,目录,单位,信息,l

    linux中查询操作命令?

    linux中查询操作命令?,信息,系统,名称,命令,地址,数字,指令,用户,历史,文件,

    linux线程操作命令?

    linux线程操作命令?,系统,工作,时间,代码,线程,信息,第一,命令,函数,操作,lin

    查看linux操作的命令?

    查看linux操作的命令?,系统,工作,信息,情况,地址,命令,软件,电脑,第一,名称,l

    linux压缩操作命令?

    linux压缩操作命令?,系统,命令,文件,名称,数据,软件,平台,目录,选项,下面,lin

    linux系统用命令操作?

    linux系统用命令操作?,系统,情况,工作,发行,位置,管理,地址,信息,密码,命令,l

    linux历史操作命令?

    linux历史操作命令?,系统,信息,地址,工作,名称,命令,管理,用户,操作,历史,如

    linux命令基本操作?

    linux命令基本操作?,工作,地址,系统,信息,管理,命令,目录,标准,操作,控制台,l

    linux数据库操作命令?

    linux数据库操作命令?,信息,系统,网络,地址,分析师,数据,名称,管理,基础,命

    linux操作命令测试?

    linux操作命令测试?,网络,系统,地址,情况,工作,命令,状态,分析,检测,标准,Lin