C++ 以循环作为参数的函数
我有以下两个功能体,让C++ 以循环作为参数的函数,c++,C++,我有以下两个功能体,让A成为一组指令,让B(I,A)成为依赖于A的另一组指令(例如A中定义的变量在B中使用)和I: //do A for(auto i = 0; i < 100; ++i) { //do B(i, A) } 是否有某种方法可以在不损失性能的情况下,在依赖于循环的单个函数中表达这一点?当然,可以用向量来表示函数,但在第一种情况下必须创建向量 根据我的理解,代码重复是A和B(i,A)的重复。如果希望在循环中发送整个循环,可以发送lambda函数的函数指针,如下所示: #i
A
成为一组指令,让B(I,A)
成为依赖于A
的另一组指令(例如A
中定义的变量在B
中使用)和I
:
//do A
for(auto i = 0; i < 100; ++i) {
//do B(i, A)
}
是否有某种方法可以在不损失性能的情况下,在依赖于循环的单个函数中表达这一点?当然,可以用向量来表示函数,但在第一种情况下必须创建向量
根据我的理解,代码重复是
A
和B(i,A)
的重复。如果希望在循环中发送整个循环,可以发送lambda函数的函数指针,如下所示:
#include<functional>
void B(std::function<void()> func)
{
func();
}
int main(void)
{
for(auto i = 0; i < 100; ++i) {
B([&](){for (auto j = 0; j < 100; j++) { } });
}
return 0;
}
#包括
void B(标准::函数func)
{
func();
}
内部主(空)
{
用于(自动i=0;i<100;++i){
B([&](){for(autoj=0;j<100;j++){});
}
返回0;
}
你可以做嵌套循环,我想
但是我想我误解了你的问题。是的,有一个限制,公共函数应该是内联的 可以将循环条件编码为迭代器对,或者理想情况下编码为范围
- 版本,如果在C++20模式下受支持:
模板 空心活套(范围r){ 用于(自动i:r){ B(i,A); } }
- 用于生成数字间隔,如
活套(std::ranges::iota_view{01100});
- 用于仅在整个容器上循环:
looper(std::views::all(someNumbers));
- 如果您还没有范围支持,请提供更多手动迭代器版本:
整个容器版本很简单,但是生成器需要一些努力。我已经在别处写了一个合适的版本,所以我将把它和一个额外的增强版本链接起来模板 空心活套(Iter开始,Iter结束){ 用于(自动iter=开始;iter!=结束;++iter){ B(*国际热核实验堆,A); } }
//do A
注释并将//do B(i,A)
更改为///do stuff
或foo(i);//某些功能
?当然,在yoir real设置中,您可能会有更多的参数来foo
。对于您的示例,我感到困惑的是,要弄清楚A
应该代表什么,在它出现的两个地方都是有意义的。将A
抽象出来会使您的示例更精简、更完整、更容易混淆。不,删除//执行实际上是不可能的,因为如果您只有一个函数foo(i)
,那么就不会有代码重复。循环之前的部分与此相关。非常好!我还没有访问c++20,但是boost版本是一个很好的替代品。对不起,我没有注意到这一点。我现在已经修好了。是的,这真是一个匆忙的写作。但现在我又把它修好了。
#include<functional>
void B(std::function<void()> func)
{
func();
}
int main(void)
{
for(auto i = 0; i < 100; ++i) {
B([&](){for (auto j = 0; j < 100; j++) { } });
}
return 0;
}