代码之家  ›  专栏  ›  技术社区  ›  PlsHelp

获取std::generator生成的第n个元素

  •  2
  • PlsHelp  · 技术社区  · 5 月前

    我试图实现一个计算n choose k的函数。我的想法是生成 n Pascal三角形的第1行,并返回其 k th元素。我想用a 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 第四排?

    1 回复  |  直到 5 月前
        1
  •  2
  •   Barry    5 月前

    这条线有两个问题:

    const std::vector row = ranges::next(pascal_triangle(), 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 执行以下操作:

    template <ranges::input_range R>
    auto nth(R&& r, ptrdiff_t n) -> decltype(auto) {
       return *ranges::next(ranges::begin(r), n);
    }