编译时生成一个省略的整数序列
Compile-time generate integer sequence with one left out
这里和这里的答案几乎是我需要的。但是,我希望能够生成如下序列:
gen_seq<5, 2> // {0, 1, 3, 4}
gen_seq<3, 0> // {1, 2}
// optional behavior that would be useful for me:
gen_seq<4, 4> // {0, 1, 2, 3}
在示例中,我使用 gen_seq 生成一个从 0 到 N-1 的序列,而不带 I。这不是强制性的,我也可以使用gen_seq其中 N 是序列的长度,I 是缺少的索引或其他变体。
我认为大多数问题已经在链接的问题中得到了解答。但是,我无法真正考虑如何将"省略此一个"条件合并到第二个参数中。
理想情况下,我很想坚持使用 c++11 功能并避免使用 c++14。不过,使用 c++14 的优雅且特别可读的灵魂也可能非常有趣。
您可以使用
以下内容:
#if 1 // Not in C++11 // make_index_sequence
#include <cstdint>
template <std::size_t...> struct index_sequence {};
template <std::size_t N, std::size_t... Is>
struct make_index_sequence : make_index_sequence<N - 1, N - 1, Is...> {};
template <std::size_t... Is>
struct make_index_sequence<0u, Is...> : index_sequence<Is...> { using type = index_sequence<Is...>; };
#endif // make_index_sequence
namespace detail
{
template <typename Seq1, std::size_t Offset, typename Seq2> struct concat_seq;
template <std::size_t ... Is1, std::size_t Offset, std::size_t ... Is2>
struct concat_seq<index_sequence<Is1...>, Offset, index_sequence<Is2...>>
{
using type = index_sequence<Is1..., (Offset + Is2)...>;
};
}
template <std::size_t N, std::size_t E>
using gen_seq = typename detail::concat_seq<typename make_index_sequence<E>::type, E + 1, typename make_index_sequence<(N > E) ? (N - E - 1) : 0>::type>::type;
static_assert(std::is_same<index_sequence<0, 1, 3, 4>, gen_seq<5, 2>>::value, "");
static_assert(std::is_same<index_sequence<1, 2>, gen_seq<3, 0>>::value, "");
static_assert(std::is_same<index_sequence<0, 1, 2, 3>, gen_seq<4, 4>>::value, "");
现场示例
生成整数序列的简单线性方法很容易适应排除特定项目,方法是添加涵盖项目被排除的情况的专用项:
#include <iostream>
// general case, ignores X
template <int N, int X, int... vals>
struct gen_seq : gen_seq<N - 1, X, N - 1, vals...> { };
template <int X, int... vals>
struct gen_seq<0, X, vals...> { static constexpr int values[] = { vals... }; };
// specialisations when vals has had X prepended: remove X
template <int N, int X, int... vals>
struct gen_seq<N, X, X, vals...> : gen_seq<N, X, vals...> { };
template <int... vals>
struct gen_seq<0, 0, 0, vals...> : gen_seq<0, 0, vals...> { };
template <int X, int... vals>
constexpr int gen_seq<0, X, vals...>::values[];
int main() {
for (auto i : gen_seq<5, 2>::values) std::cout << i << std::endl; // 0 1 3 4
for (auto i : gen_seq<3, 0>::values) std::cout << i << std::endl; // 1 2
for (auto i : gen_seq<4, 4>::values) std::cout << i << std::endl; // 0 1 2 3
}
它可能不如其他更高级的方法有效,但它是最具可读性的。与你自己的答案和Jarod42的答案不同,这不是在现有算法的基础上构建新算法,而是从头开始构建一个新算法。
写
下你的问题总是很棒。
我刚刚发现我可以使用分而治之的方法,不是从 0 到 N/2 和 N/2 + 1 到 n,而是在第一步中生成从 0 到 I - 1 和从 I + 1 到 N。
这,我可以与线性或对数深度生成方法结合使用。现在我觉得问很愚蠢,但至少我不再被困住了。
相关文章:
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- 如何将一个数组值合并为一个整数c++
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 我可以将迭代器递增一个整数吗?
- 有没有办法生成一个包含平方的序列,这些平方加起来就是一个整数平方?
- 我正在尝试制作一个程序,在添加 n 天(整数)后告诉一个人什么是一天(例如星期一等)
- 为什么将两个浮点数相加会得到一个整数C++?
- 编写一个读取五个整数并执行一些任务的C++程序
- 如果我们在其中输入一个整数,则字符会给出整数作为输出,但是当分配给它一个整数时,这不会发生。为什么?
- 给枚举一个整数,并在 C++ 中将其相关值作为字符串获取
- 我需要编写一个程序来读取一个文件,该文件将输出所有唯一的整数,如果已经看到整数,它将被关闭
- 按升序输出整数时,将最后一个整数放在新行上
- 编写一个程序,提示用户输入一个整数,然后输出数字的单个数字和数字的总和
- 我在c++中遇到了一个奇怪的错误,其中一个计算2个小整数加法的语句溢出到一个长值中
- 如何在C++中将一个值拆分为一个十进制整数
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 我必须更改我的数字最后一个数字和第一个数字,但不要使用仅带有整数或循环的函数.例如从 12345 到 52341
- 将整数范围映射到另一个范围