小编LKl*_*vin的帖子

将多个for循环组合成单个迭代器

说我有一个像窝一样的循环

for (int x = xstart; x < xend; x++){
    for (int y = ystart; y < yend; y++){
        for (int z = zstart; z < zend; z++){
            function_doing_stuff(std::make_tuple(x, y, z));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并希望将其转化为

MyRange range(xstart,xend,ystart,yend, zstart,zend);
for (auto point : range){
    function_doing_stuff(point);
}
Run Code Online (Sandbox Code Playgroud)

我如何编写MyRange类与嵌套for循环一样高效?这样做的动机是能够使用std算法(例如转换,累积等),并创建主要与维度无关的代码.

通过使用迭代器,可以轻松创建在1d,2d或3d点范围内运行的模板化函数.

代码库目前是C++ 14.

编辑:

写清楚的问题很难.我会试着澄清一下.我的问题不是写一个迭代器,我能做到.相反,问题是性能问题:是否有可能使迭代器与嵌套for循环一样快?

c++ loops c++14

17
推荐指数
4
解决办法
549
查看次数

如何在函数参数初始化中捕获未定义的行为

以下代码在clang ++中有效,但在g ++中崩溃了

#include<vector>
#include<iostream>

template<class Iterator>
double abs_sum(double current_sum, Iterator it, Iterator it_end){
    if (it == it_end)
        return current_sum;
    return abs_sum(current_sum+std::abs(*it),++it,it_end);
}


int main(int argc, char** argv){
    std::vector<double> values {1.0, 2.0,-5};

    std::cout << abs_sum(0.0,values.begin(),values.end()) << std::endl;;
}
Run Code Online (Sandbox Code Playgroud)

罪魁祸首证明是这条线:

return abs_sum(current_sum+std::abs(*it),++it,it_end);
Run Code Online (Sandbox Code Playgroud)

在clang中,*it在之前进行评估++it,在g ++中它是相反的,导致迭代器在被解除引用之前被增加.事实证明,评估函数参数的顺序是实现定义的.

我的问题是:我如何捕获此类错误?理想情况下,当我意外地依赖于具体实施细节时,我想要出错或至少发出警告.

即使用-Wall,clang和gcc都不会发出任何警告.

c++ undefined-behavior unspecified-behavior

6
推荐指数
1
解决办法
170
查看次数