微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用带有长度参数的 iter::product

如何解决如何使用带有长度参数的 iter::product

在下面的代码中,我想获取长度为 n 的所有乘积,这是一个函数的参数。显然,该乘积函数不适用于长度参数。当我给出一个整数时,代码不会抱怨。 我还想遍历产品中的所有元素并打印它们,但它说它不能打印元组

我该如何解决这个问题?

#include <../cppitertools-master/product.hpp>

vector<complex<double>> print_products(int n) {
    vector<complex<double>> solutions = {};
    vector<int> options = { 1,-1 };
 
    for (auto&& combination : iter::product<n>(options)) {
        for (auto&& c : combination) {
            cout << c << " ";
        }
        cout << endl;
    }
}

使用参数 n 时出现的错误

no instance of overloaded function "iter::product" matches the argument list,argument types are: (std::vector<int,std::allocator<int>>)

在使用 2 作为参数时尝试打印组合时遇到的错误

this range-based 'for' statement requires a suitable "begin" function and none was found

解决方法

iter::product<n> 要求 n 是编译时常量,但它不是。

这个库有一个关于实现一个需要运行时重复次数的版本的公开问题。

元组不是可以用 for 循环的东西。运行时计数 product 的返回值不能是元组,因此不要担心原始案例的第二个错误。

你也必须用编译时常量索引一个元组。

for (auto&& combination : iter::product<2>(options)) {
    std::cout << get<0>(combination) << " " << get<1>(combination) << " " << std::endl;
}

如果您对计数进行模板化,则可以使用 std::index_sequence 来保存数字的编译时间序列

template <typename T,size_t... Is>
void print_product(T&& combination,std::index_sequence<Is...>) {
    (std::cout << get<Is>(std::forward<T>(combination))),...) << std::endl;
}

template <size_t N>
void print_products() {
    vector<int> options = { 1,-1 };
 
    for (auto&& combination : iter::product<N>(options)) {
        print_product(combination,std::make_index_sequence<N>{});
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?