说我有一个像窝一样的循环
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循环一样快?
以下代码在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都不会发出任何警告.