range-v3 views :: drop和views :: drop_exactly有什么区别?

问题描述

有人可以解释range-v3的视图适配器dropdrop_exactly间的区别吗?

我观察到的一个区别是,如果传递给这些视图的范围内的元素数量少于视图适配器的参数,则drop似乎是正确的选择,而{{ 1}}似乎在调用UB。

当参数小于传递给这些视图的范围内的元素数量时,它们似乎都工作相同:

drop_exactly

这里是code

解决方法

documentation drop_exactly

给出一个源范围和一个整数,返回一个包含以下内容的范围 源范围中除第一个 count 个元素之外的所有元素。 源范围必须至少包含这么多元素。

drop 的文档说明:

给出一个源范围和一个整数,返回一个包含以下内容的范围 源范围中除第一个 count 个元素之外的所有元素,或一个 如果元素较少,则为空范围

重点已添加


猜测drop_exactly避免了边界检查,因此有可能以更高的性能表现为代价,但可能会超出管道的end,在容器中,而drop显然会进行边界检查以确保您没有这样做。

这与您看到的一致。如果您从begin()+7的{​​{1}}到begin()+5(又名end())打印内容,则中止条件是用std::vector而不是{{1 }},然后您将继续打印位于向量分配空间中的垃圾数据,直到在某个时候运行了分配的块,并且操作系统介入并隔离了二进制文件。

因此,如果您知道具有要删除的条目数量的容器,请使用更快的!=,否则请使用<

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...