Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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++ 为什么添加view::filter会触发多个冗余sentinel检查?_C++_Sentinel_Range V3 - Fatal编程技术网

C++ 为什么添加view::filter会触发多个冗余sentinel检查?

C++ 为什么添加view::filter会触发多个冗余sentinel检查?,c++,sentinel,range-v3,C++,Sentinel,Range V3,给定的str是一个字符串 auto str = std::string{}; getline(std::cin, str); 我注意到当我们有一个view::filter存在于一个惰性范围时,即使使用-O3,也会有许多冗余的哨兵检查。行政长官 使用-DNDEBUG,它可以产生更好的结果,但似乎还有一个多余的延迟 更新2 我尝试添加另一个变换。似乎在view::filter本身的后面只有一组冗余检查。行政长官 for(自动sv:str |范围::视图::定界('#')) //(1)此处的指针检

给定的
str
是一个字符串

auto str = std::string{};
getline(std::cin, str);
我注意到当我们有一个
view::filter
存在于一个惰性范围时,即使使用-O3,也会有许多冗余的哨兵检查。行政长官

使用
-DNDEBUG
,它可以产生更好的结果,但似乎还有一个多余的延迟


更新2 我尝试添加另一个变换。似乎在
view::filter
本身的后面只有一组冗余检查。行政长官

for(自动sv:str |范围::视图::定界('#'))
//(1)此处的指针检查和定界检查
|范围::视图::过滤器(仅限YALPHA)
//(2)此处还包括指针检查和定界检查
|范围::视图::转换(到整数)
|范围::视图::变换(到_ints2)){

std::cout
std::string\u视图(nullptr)
具有未定义的行为:您想要
std::string\u视图()
。如果要分析程序集,可能需要使用
-DNDEBUG
进行编译,以关闭range-v3中的调试检查。@Casey感谢您的指导。我修复了它并添加了一些更新。
-DNDEBUG
帮助很大,但在进入转换之前仍有额外的检查。
for (auto sv : str | ranges::view::delimit('#')
                   // (1) pointer check and delimit check here
                   | ranges::view::filter(onlyalpha)
                   // (2) pointer check and delimit check here also!
                   | ranges::view::transform(to_ints) ) {
    std::cout << sv;
    // (3) pointer check and delimit check here too!
}
auto to_ints_with_filter = [](unsigned char ch){
    if (std::isalpha(ch)) {
        auto index = (ch - 1) & 0b0001'1111; 
        static constexpr auto table = 
            std::array<char,27> {
                "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            };
        return std::string_view(&table[index],1);
    }
    else
        return std::string_view();
};
for (auto sv : str | ranges::view::delimit('#')
                   | ranges::view::transform(to_ints_with_filter ) ) {
    std::cout << sv;
}
for (auto sv : str | ranges::view::delimit('#')
                   // (1) pointer check and delimit check here
                   | ranges::view::filter(onlyalpha)
                   // (2) pointer check and delimit check here also
                   | ranges::view::transform(to_ints) ) {
    std::cout << sv;
}
for (auto sv : str | ranges::view::delimit('#')
                   // (1) pointer check and delimit check here
                   | ranges::view::filter(onlyalpha)
                   // (2) pointer check and delimit check here also
                   | ranges::view::transform(to_ints)
                   | ranges::view::transform(to_ints2) ) {
    std::cout << sv;
}