我试图实现一个计算n choose k的函数。我的想法是生成 n Pascal三角形的第1行,并返回其 k th元素。我想用a std::generator 为了这个。
n
k
std::generator
问题是我找不到一种方法来获得 n th产生了元素。
我的代码看起来像这样:
#include <generator> #include <ranges> #include <vector> std::generator<std::vector<long>> pascal_triangle() { std::vector<long> current_row{1}; while (true) { co_yield current_row; std::vector<long> next_row; next_row.reserve(current_row.size() + 1); next_row.push_back(1); for (const auto& [left_element, right_element] : std::views::pairwise(current_row)) { next_row.push_back(left_element + right_element); } next_row.push_back(1); current_row = std::move(next_row); } } long choose(const int n, const int k) { // This line does not compile. const std::vector row = std::ranges::next(pascal_triangle(), n); return row[k]; }
我需要做什么才能得到 n 第四排?
这条线有两个问题:
const std::vector row = ranges::next(pascal_triangle(), n);
第一个是 std::ranges::next 接受迭代器,而不是范围。第二,它 退货 迭代器,而不是元素。 std::ranges::next(i, n) 是对 i + n ,这不是对 i[n] .
std::ranges::next
std::ranges::next(i, n)
i + n
i[n]
解决这两个问题后,这将编译:
const std::vector row = *std::ranges::next(pascal_triangle().begin(), n);
当然,你可以编写自己的函数来实现你想要的功能 ranges::next 执行以下操作:
ranges::next
template <ranges::input_range R> auto nth(R&& r, ptrdiff_t n) -> decltype(auto) { return *ranges::next(ranges::begin(r), n); }