range函数类似于python,但适用于c++ 17 (double)



我试图创建一个函数,从开始到结束用某个步骤填充我的向量值。用于double类型和c++ 17版本。知道怎么做吗?

vector<double> generateRange(double start, double end, double step)
{

}
int main()
{
// return [10, 10.5, 11,...., 12]
auto range = generateRange(10, 12, 0.5);
for (auto i : range)
std::cout << i << ' ';
}

对于int类型,这将是一个非常简单的循环,但对于double类型…

例如,您可以编写一个简单的循环来生成您想要的向量。

然而,python中的range函数不返回列表,而是返回生成器,这要快得多。你应该在c++中返回一个生成器(范围),而不是返回一个向量。实现一个生成器更高级一些。

标准库附带了可用于构建此类生成器的工具。下面是你的例子:

auto step_fun = [=](auto x) { return x * step + start; };
auto end_pred = [=](auto x) { return x <= end; };
auto range =
std::views::iota(0)
| std::views::transform(step_fun)
| std::views::take_while(end_pred);

我不认为在迭代之前一定要将值存储在vector中。

我会这样做

/**
g++ -std=c++17 -o prog_cpp prog_cpp.cpp 
-pedantic -Wall -Wextra -Wconversion -Wno-sign-conversion 
-g -O0 -UNDEBUG -fsanitize=address,undefined
**/
#include <iostream>
#include <algorithm>
inline
auto // iterable
generate_range(double from_count,
double to_count,
double step)
{
struct Iter
{
double count;
double step;
bool operator!=(const double &rhs) const { return count<=rhs; } // oh!!!
void operator++() { count+=step; }
auto operator*() const { return count; }
};
struct Enumerate
{
double from_count;
double to_count;
double step;
auto begin() { return Iter{from_count, step}; }
auto end() { return to_count; }
};
return Enumerate{std::min(from_count, to_count),
std::max(from_count, to_count),
step};
}
int
main()
{
for(const auto &value: generate_range(10, 12, 0.5))
{
std::cout << value << ' ';
}
std::cout << 'n'; // 10 10.5 11 11.5 12
for(const auto &value: generate_range(239.99, 237.36, 1))
{
std::cout << value << ' ';
}
std::cout << 'n'; // 237.36 238.36 239.36
return 0;
}

注意!=实际测试<=;它是丑陋的,但它有效。

此函数返回提供begin()end()成员函数的东西,以便range-for循环可以使用它。

编辑:增加了最小/最大的倒立边界。

我的解决方案:

#include <vector>
using std::vector;
#include <iostream>
using std::cout;
#include <algorithm>
vector<double> generateRange(double start, double end, double step)
{
int vector_size = (end - start) / step;
vector<double> values(vector_size);
std::for_each(begin(values), std::end(values),
[start, step, i = 0](double &actual) mutable {
actual = start + step * i;
i++;
});
return values;
}
int main()
{
// return [10, 10.5, 11,...., 12]
auto range = generateRange(10, 12, 0.5);
for (auto i : range)
std::cout << i << ' ';
}

如果你对我使用的函数有任何问题,请随时问我:)

最新更新