【问题标题】:C++ Making tuple from two tuples by randomly choosing their elementsC++ 通过随机选择两个元组的元素来创建元组
【发布时间】:2016-06-16 15:06:10
【问题描述】:

我到底想要什么:我有一对类型未知且参数数量未知的元组,但这两个元组的类型和变量计数完全相同,例如:

std::pair<std::tuple<Ts...>, std::tuple<Ts...>>

我们称这些元组为 A 和 B

现在我想通过以下方式从这两个具有完全相同的类型和参数计数 (std::tuple&lt;Ts...&gt;) 的新元组中创建一个新元组:

1.为一个元素随机选择元组 A 或 B(我想我可以通过调用 std::experimental::rand_int(0,1) 或另一个生成器来做到这一点)。

2。将此元素放在新元组中(我们称之为 C)(也许 std::experimental::apply 可能有助于指出 2.3. >?)

3。重复步骤 1-2,直到元组 A 和 B 结束

示例:

A = std::tuple<double, int, long, int> {2.7, 1, 22, 4};
B = std::tuple<double, int, long, int> {12.4, 7, -19, 18};

算法后我想接收,例如:

C = std::tuple<double, int, long, int> {12.4, 1, 22, 18}; 

(或遵循此方案的 A 和 B 的任何其他组合)

【问题讨论】:

  • 只是递归地做。你需要代码吗?
  • @SergeyA 因为我的 C++ 理论比较好,而且到目前为止还没有太多实践,如果你有足够的时间,这对我很有帮助。
  • 您提供的建议似乎还可以,您到底坚持哪一部分?
  • 我会提供几个代码:)
  • @GuyGreer 使用 std::experimental::apply 获取递归算法,它接受两个元组并随机化是从 A 还是从 B 中选择元素并将其放入元组 C 中。

标签: c++ c++11 random tuples c++14


【解决方案1】:

不应该太难:

template <typename Tuple, std::size_t ...I>
Tuple rand_tuple_aux(const Tuple & a, const Tuple & b, std::index_sequence<I...>)
{
    return Tuple(std::get<I>(flip_coin() ? a : b)...);
}

template <typename ...Args>
std::tuple<Args...> rand_tuple(const std::tuple<Args...> & a,
                               const std::tuple<Args...> & b)
{
    return rand_tuple_aux(a, b, std::index_sequence_for<Args...>());
}

【讨论】:

  • index_sequence_for&lt;Args...&gt;() 在这里较短
  • @GuyGreer:我不知道它的存在。谢谢!
【解决方案2】:

我知道有一个标记的答案,所以我不会更改它,但我想添加我的解决方案(它很hackish,所以不建议这样做,但我想让这个函数成为一个 lambda)。 父母类型:

std::pair<std::pair<std::tuple<Ts...>>, std::pair<std::tuple<Ts...>>>

(这就是我使用自动的原因...)

代码如下:

auto generate_child=[&](const auto& parents){
            auto genotype=std::experimental::apply(
                    [&](const auto&... mother){
                        return std::experimental::apply(
                                [&](const auto&... father){
                                    return std::make_tuple(
                                            (std::experimental::randint(0,1)?mother:father)...
                                    );
                                },
                                parents.second.second
                        );
                    },
                    parents.first.second
            );
            return std::make_pair(
                    std::experimental::apply(function,genotype),
                    genotype
            );
        };

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    相关资源
    最近更新 更多