C++ range-v3 views::drop和views::drop\u之间的区别到底是什么?
有人能准确地解释range-v3的视图适配器C++ range-v3 views::drop和views::drop\u之间的区别到底是什么?,c++,range-v3,C++,Range V3,有人能准确地解释range-v3的视图适配器drop和drop\u之间的区别吗 我观察到的一个不同之处是,如果传输到这些视图的范围内的元素数量小于视图适配器的参数,drop似乎做了正确的事情,而drop\u恰恰是似乎调用了UB 当参数小于通过管道传输到这些视图的范围内的元素数时,它们的工作方式似乎相同: #include <iostream> #include <vector> #include <range/v3/all.hpp> namespace rv
drop
和drop\u之间的区别吗
我观察到的一个不同之处是,如果传输到这些视图的范围内的元素数量小于视图适配器的参数,drop
似乎做了正确的事情,而drop\u恰恰是
似乎调用了UB
当参数小于通过管道传输到这些视图的范围内的元素数时,它们的工作方式似乎相同:
#include <iostream>
#include <vector>
#include <range/v3/all.hpp>
namespace rv = ranges::views;
int main()
{
std::vector<int> v { 1, 2, 3, 4, 5};
for (int i : v | rv::drop(3))
std::cout << i; // prints 45
for (int i : v | rv::drop(7))
std::cout << i; // prints nothing
for (int i : v | rv::drop_exactly(3))
std::cout << i; // prints 45
for (int i : v | rv::drop_exactly(7))
std::cout << i; // prints garbage and crashes
}
#包括
#包括
#包括
名称空间rv=范围::视图;
int main()
{
std::向量v{1,2,3,4,5};
对于(int i:v | rv::drop(3))
std::cout从for下拉列表中精确地
给定源范围和整数计数,返回一个包含
源范围中除第一个计数元素外的所有元素。
源范围必须至少有这么多元素。
而drop
的文档说明:
给定源范围和整数计数,返回一个包含
在源范围中除第一个计数元素外的所有元素中,或
如果元素较少,则范围为空
重点补充
我猜drop\u恰恰可以避免边界检查,因此可能会稍微提高性能,但代价是可能会超过管道容器的端,而drop
显然会执行边界检查,以确保您不会这样做
这与您看到的一致。如果您从begin()+7
打印到begin()+5
(又称end()
)对于std::vector
,中止条件是用!=
而不是实现的,文档解释了UB发生的原因。对性能的边界检查似乎是对差异的合理解释。我将等待,看看是否有人知道答案,或者从实现中找出答案。@cigien作为不必要的语言律师,您之所以看到UB,是因为您正在使用的库的文档说明了这一点。特别禁止在较短的源代码范围内使用管道。:)