如何在C++中创建自己的循环版本?
How to create my own loop version in C++?
我想知道是否可以创建自定义函数,如for,for_each,while等。
我不想做的是现有循环不会做的。我只是好奇地想知道它们是如何工作的,以及我是否需要创建自己的。
例如,如果要创建仅接受参数的 for 函数的另一个版本。
在此示例中,我想创建一个仅接受一个参数(整数(的 for。 而不是写作
for (int i = 0; i < 50; ++i)
我会创建一个这样的版本
for_(50)
他们会采取同样的行动。我该怎么做这样的事情?
我已经在另一个论坛上发布了这个问题。
除了其他答案中的建议外,您还可以创建一个如下所示的函数,但最后,它与使用标准std::for_each
非常相似。
#include <iostream>
#include <functional>
template<typename C, typename F>
void for_(C begin_, C end_, F&& f) { // [begin_, end_)
for (C i = begin_; i < end_; ++i) {
f(i);
}
}
template<typename C, typename F>
void for_(C count, F&& f) { // special case for [0, count)
for_(0, count, f);
}
void mul2(int x) {
std::cout << x*2 << " ";
}
int main() {
for_(10, [](int i) { std::cout << i << "n"; });
for_(2, 10, mul2);
}
一个丑陋且不安全的解决方案是使用宏:
#define REPEAT(i,N) for(int (i) = 0; (i) < (N); ++(i))
int main()
{
REPEAT(i,10) std::cout << i << std::endl;
return 0;
}
不能扩展新循环的C++语法。
你可以使用宏,但这很丑陋,通常最好避免。获得类似内容的另一种方法是将函子作为参数传递,这极大地帮助了将 lambda 表达式引入 C++。您可以在<algorithm>
标题中找到一些此类示例。
例如:
#include <algorithm>
#include <vector>
int main()
{
std::vector<int> numbers = { 1, 4, 5, 7, 10 };
int even_count = 0;
for (auto x : numbers)
{
if (x % 2 == 0)
{
++even_count;
}
}
auto even_count2 = std::count_if(numbers.begin(), numbers.end(), [](int x) { return x % 2 == 0; });
}
您可以使用 lambda 函数并将函数对象作为参数传入,以便为循环的每次迭代执行。
#include <iostream>
#include <functional>
int main()
{
auto for_ = [](int start, int size, std::function<void (int i)> fn)
{
int end = start + size;
for (int i = start; i < end; ++i)
{
fn(i);
}
};
for_(0, 10, [](int i) { std::cout << i << std::endl; });
for_(0, 10, [](int i) { std::cout << i*2 << std::endl; });
}
看来你在这里重新发明了轮子。你可以只使用std::for_each
.
但是,您可以使用执行不同操作的自定义 lambda 函数,并且只在 lambda 本身中实现操作,而无需为操作获取函数对象。
相关文章:
- 没有为自己的结构调用列表推回方法
- 用于C++中带有数组和指针的循环
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 对于set上的循环-获取next元素迭代器
- 下面是我为检测链接列表中的循环而制作的代码
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- C++有多少类型的循环
- 并行用于C++17中数组索引范围内的循环
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 理解循环C++中的循环
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 使用输入打破 OpenMP 中的循环
- C++从对象自己的类中删除对象
- string1 == string2 和你自己的 for 循环比较有什么区别?
- 如何在C++中创建自己的循环版本?
- 在其自己的卷发括号内进行循环
- QT(4.8.2)GUI-自己的主循环,而不是qapplication :: exec()
- NSURLConnection在其自己的线程中没有旋转循环就无法工作
- 循环问题:从它自己的成员函数中访问一组对象