Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++ range-v3 views::drop和views::drop\u之间的区别到底是什么?_C++_Range V3 - Fatal编程技术网

C++ range-v3 views::drop和views::drop\u之间的区别到底是什么?

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

有人能准确地解释range-v3的视图适配器
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,是因为您正在使用的库的文档说明了这一点。特别禁止在较短的源代码范围内使用管道。:)