gpt4 book ai didi

c++ - 如何对两个容器元组进行排序?

转载 作者:太空狗 更新时间:2023-10-29 21:37:19 29 4
gpt4 key购买 nike

我有两个元组,每个元组包含不同类型的容器。

std::tuple<containerA<typesA>...> tupleA;
std::tuple<containerB<typesB>...> tupleB;

所以,举个例子tupleA可以这样定义:

std::tuple<list<int>, list<float>> tupleA;

两个容器,containerAcontainerB是不同的类型。 typesAtypesB不要相交。我想按大小对元组中的容器进行排序,并能够按类型访问它们。所以,举个例子

std::tuple<list<int>, list<float>> tupleA {{2}, {3.3f, 4.2f}};
std::tuple<deque<double>, deque<uint8_t>> tupleB {{2.0, 1.2, 4.4}, {}};

auto sortedArray = sort(tupleA, tupleB);
sortedArray == {deque<uint8_t>, list<int>, list<float>, deque<double>};
sortedArray.get<list<float>>() == {3.3f, 4.2f};
std::get<list<int>>(tupleA).push_back(4);
std::get<list<int>>(tupleA).push_back(5);
std::get<list<int>>(tupleA).push_back(6);
sortedArray = sort(tupleA, tupleB);
sortedArray == {deque<uint8_t>, list<float>, deque<double>, list<int>};

最重要的部分是我必须存储 sortedArray并且元组中元素的大小可能会改变。我无法创建这样的 sort功能。访问 sortedArray 的实际语法不重要。

我尝试对 sortedArray 中的容器数据使用朴素索引,例如使用 std::pair<A, 1>引用元组 A 中的第二个元素,但是我无法通过它访问元组的信息,因为它不是 constexpr

最佳答案

这是可能的,但并不容易。

首先,您需要生成 N 个元素(它们有 N 个阶乘)的每个排列的编译时列表。

同时编写运行时和编译时排列对象(分开)。

制作一个从排列到索引的运行时映射。 ( map 步骤)

将您的元组转换为(索引,大小)的 vector 。按大小排序。提取排列。将其映射到排列集合的索引。 (排序步骤,使用map步骤)

写一个接受函数对象的“魔法开关”f和一个排列索引,并调用 f与编译时排列。 (神奇的一步)

编写代码,采用编译时排列并根据它重新排序元组。 (重新排序步骤)

编写接受函数对象的代码 f和一个 tuple .执行(排序步骤)。做(神奇的一步),给它提供第二个函数对象 g它采用传入的排列和元组和(重新排序步骤),然后调用 f与它。

调用执行此操作的函数 bob .

std::tuple<list<int>, list<float>> tupleA {{2}, {3.3f, 4.2f}};
std::tuple<deque<double>, deque<uint8_t>> tupleB {{2.0, 1.2, 4.4}, {}};

bob(concat_tuple_tie(tupleA, tupleB), [&](auto&& sorted_array){
assert( std::is_same<
std::tuple<deque<uint8_t>&, list<int>&, list<float>&, deque<double>&>,
std::decay_t<decltype(sorted_array)>
>::value, "wrong order" );
sortedArray.get<list<float>>() == {3.3f, 4.2f};
});
std::get<list<int>>(tupleA).push_back(4);
std::get<list<int>>(tupleA).push_back(5);
std::get<list<int>>(tupleA).push_back(6);
bob(concat_tuple_tie(tupleA, tupleB), [&](auto&& sorted_array){
assert( std::is_same<
std::tuple<deque<uint8_t>&, list<float>&, deque<double>&, list<int>&>,
std::decay_t<decltype(sorted_array)>
>::value, "wrong order" );
});

就我个人而言,我怀疑您是否需要这样做。

我可以做到这一点,但这可能会花费我几个小时,所以我不会为了 SO 答案而这样做。你可以看看我的magic switch上面最神奇的代码。另一个困难的部分是排列步骤。

请注意,代码使用连续传递样式。另请注意,lambda 的每个 排列都已实例化,包括错误的排列,因此您的代码必须对每个排列都有效。这可能会导致大量代码膨胀。

另一种解决方案可能涉及在您的容器周围创建类型删除包装器并简单地对它们进行排序,但这不是您要求的。

关于c++ - 如何对两个容器元组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37972572/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com