如何在C++中创建自己的循环版本?

How to create my own loop version in C++?

本文关键字:自己的 循环 版本 创建 C++      更新时间:2023-10-16

我想知道是否可以创建自定义函数,如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 本身中实现操作,而无需为操作获取函数对象。