对于具有 3 个集合元素的示例,您可以这样做:
for (s = 1; s <= 7; ++s)
{
// ...
}
这是一个演示程序:
#include <iostream>
int main()
{
const int num_elems = 3; // number of set elements
const int elems[num_elems] = { 1, 2, 3 }; // mapping of set element positions to values
for (int s = 1; s < (1 << num_elems); ++s) // iterate through all non-null sets
{
// print the set
std::cout << "{";
for (int e = 0; e < num_elems; ++e) // for each set element
{
if (s & (1 << e)) // test for membership of set
{
std::cout << " " << elems[e];
}
}
std::cout << " }" << std::endl;
}
return 0;
}
编译和测试:
$ g++ -Wall sets.cpp && ./a.out
{ 1 }
{ 2 }
{ 1 2 }
{ 3 }
{ 1 3 }
{ 2 3 }
{ 1 2 3 }
请注意,使最低有效位对应于第一个集合元素是一种常见的约定。
另请注意,我们省略了空集 s = 0,因为您似乎不想包含它。
如果您需要使用大于 64 个元素的集合(即uint64_t
),那么您将需要一种更好的方法 - 您可以扩展上述方法以使用多个整数元素,或者使用std::bitset
or std::vector<bool>
,或者使用类似@Yochai 的答案(使用std::next_permutation
) .