C++ 从向量生成元组(通用算法)

C++ 从向量生成元组(通用算法),c++,stl,C++,Stl,假设我们有一个只有唯一值的向量,并且希望生成所有对。这样做的算法是: vector< int > data; // ... pushback some data vector< vector< int > > pairs; for( size_t i = 0; i < data.size() - 1; ++i ) { for( size_t j = i + 1; j < data.size(); ++j ) {

假设我们有一个只有唯一值的向量,并且希望生成所有对。这样做的算法是:

vector< int > data;
// ... pushback some data

vector< vector< int > > pairs;

for( size_t i = 0; i < data.size() - 1; ++i )
{
    for( size_t j = i + 1; j < data.size(); ++j )
    {
        vector< int > pair; 
        pair.push_back( data[i] ); 
        pair.push_back( data[j] );

        pairs.push_back( pair );
    }
}
vector数据;
// ... 推回一些数据
向量>对;
对于(size_t i=0;i对;
pair.push_back(数据[i]);
成对推回(数据[j]);
成对。推回(成对);
}
}
现在,对于三元组,算法更改为:

vector< int > data;
// ... pushback some data

vector< vector< int > > triples;

for( size_t i = 0; i < data.size() - 2; ++i )
{
    for( size_t j = i + 1; j < data.size() - 1; ++j )
    {
        for( size_t k = j + 1; k < data.size(); ++k )
        {
            vector< int > triple; 
            triple.push_back( data[i] ); 
            triple.push_back( data[j] );
            triple.push_back( data[k] );

            triples.push_back( triple );
        }
    }
}
vector数据;
// ... 推回一些数据
向量>三元组;
对于(size_t i=0;itriple;
三重。推回(数据[i]);
三重。推回(数据[j]);
三重。推回(数据[k]);
三倍。推回(三倍);
}
}
}
为四元组和其他元组类型编写代码相当容易

有人能告诉我如何实现生成所有元组的通用算法吗?既然我们已经做到了,我如何计算给定向量中元素数的元组数呢?对于配对,公式为n(n-1)/2


谢谢

您所描述的称为k-组合,这是组合学领域中一个非常重要的概念。一组n个元素中k个元素的唯一组合数用公式n表示/(k!(n-k)!)

为了以一种通用的方式有效地解决这个问题,您可能应该研究
std::tuple
和可变模板(C++11特性)。但是,如果在编译时不知道维度,则必须创建一个递归函数,该函数包含两个参数:所有项的列表和从列表中选择的项数k

然后,对于集合中的每个元素e,创建一个列表,其中包含该元素以及以k-1作为编号递归调用函数的结果,以选择并仅提供列表中e之后的元素。这将防止在递归的多个子树中创建相同的子集


希望这对你来说足够清楚。:)如果您还有任何问题,请随时询问更多解释。

我正在考虑递归模板,尽管我不知道如何实现它。您可以将您的三元组算法视为:对于每个I,生成比I大的所有元素对,将I添加到每个元素对中,使其成为三元组,并将它们附加到结果中。在那个句子中,你可以用四元组替换三元组,用三元组替换配对。看起来很递归:-)看看这个