迭代一个n元组
Iterating through an n-tuple
是否有一种聪明的方法来迭代n元组,其中元组中的每个元素都可以取k个值(总共k^n种可能性)。我猜当k=2时你可以通过十进制递增来遍历位数组。k的其他值呢?
我实际上是在c++中寻找一种可能的方法在这种情况下k可以取{-1,0,1}
可以。
template<class E, E...es>
struct elements:std::integral_constant<unsigned, sizeof...(es)> { using type=E; };
template<class E, E e0, E e1, E... es>
constexpr E next_helper( elements<E, e0, e1, es...>, E e, E first ) {
return (e0 == e)?e1:next_helper( elements<E, e1, es...>{}, e, first );
}
template<class E, E e0>
constexpr E next_helper( elements<E, e0>, E e, E first ) {
return first;
}
template<class E, E e0, E... es>
constexpr E next_helper( elements<E, e0, es...>, E e ) {
return next_helper( elements<E, e0, es...>{}, e, e0 );
}
template<class elements, class E>
constexpr E next( E e ) {
return next_helper( elements{}, e );
}
template<class elements, class E>
constexpr E next( E e, unsigned N );
template<class E, E...es>
constexpr E next_helper( elements<E,es...>, E e, unsigned N ) {
return (N>=sizeof...(es))?next<elements>( e, (N%sizeof...(es)) ):next<elements>( next<elements>( e, (N)/2 ), (N+1)/2 );
}
template<class elements, class E>
constexpr E next( E e, unsigned N ) {
return (N==0)?e:(N==1)?next<elements>(e):next_helper<elements>( next_helper<elements>( N/2, e ), (N+1)/2 );
}
template<class E, E e0, E e1, E... es>
constexpr unsigned index_helper( elements<E, e0, e1, es...>, E e ) {
return (e0==e)?0:(index_helper( elements<E, e1, es...>{}, e )+1);
}
template<class E, E e0>
constexpr unsigned index_helper( elements<E, e0>, E e ) {
return 0;
}
template<class elements, class E>
constexpr unsigned index( E e ) {
return index_helper( elements{}, e );
}
template<class E, E e0, E... es>
constexpr unsigned first_helper(elements<E, e0, es...>) {
return e0;
}
template<class elements>
constexpr auto first() -> typename elements::type {
return first_helper(elements{});
}
template<class elements>
constexpr auto nth(unsigned n) -> typename elements::type {
return next<elements>( first<elements>(), n );
}
template<typename elements>
struct iteration_tuple {
using value_type = typename elements::type;
std::vector<value_type> data;
bool advance() {
bool finished = true;
for( value_type& e : data ) {
if ( first<elements>() != ( e = next<elements>(e) ) )
finished = false;
if (!finished)
break;
}
return finished;
}
iteration_tuple( unsigned size ) {
data.resize( size, first<elements>() );
}
};
int main() {
typedef elements<int, -1, 0, 1> sequence;
iteration_tuple<sequence> sample(3);
do {
for (int x:sample.data)
std::cout << x << ",";
std::cout << "n";
} while(!sample.advance());
}
生活例子
相关文章:
- 在boost::hana中给定一个键元组,如何从映射中获取值元组
- 从 c++ 中的字符串向量创建一个元组
- 用一个额外的元素扩展 std::array 的每个 std::元组
- 我在代码中收到一个运行时错误,该错误如何通过修改最多一个元素来查找数组是否可以变得不减少
- 使用对另一个元组不同类型的元素的非常量引用来初始化元组的元素
- 您可以static_assert一个元组只有一种满足特定条件的类型
- 使用参数包和元组创建一个简单的表达式类
- 如何将多个可变参数模板元组类组合成一个类?
- 我如何打印一个元组矢量
- 初始化boost :: hana ::元组用一个参数
- 如何创建一个 std::tuple,其中包含由索引元组指定的向量中的成员
- c++存储映射元组的引用,以便在另一个函数中使用
- 接受元组并返回另一个元组的功能
- 通过在上一个数组结束后立即存储下一个元素来扩展数组
- 做一个CPP分类的元组
- 用另一个元组中的元素填充一个元组
- 我正在使用可变参数模板在 C++11 中创建一个元组类。如何使用其实例变量?
- 创建一个元组样式的类来优化未使用的部分
- 如何剥离一个元组<>回到可变类型模板列表
- 段故障返回一个元组