I think I know what he is asking. Let's say I want to list all subsets of size 3 of the numbers in {0, 1, ..., 9}. I could do this:
for (int i1 = 0; i1 < 10; ++i1) {
for (int i2 = i1 + 1; i2 < 10; ++i2) {
for (int i3 = i2 + 1; i3 < 10; ++i3) {
// Do something
}
}
}
However, this is kind of ugly and you cannot easily make it work for subsets of size k. The solution is using a recursive function. I believe the name for this technique is "backtracking". It's a little bit involved, but it's very powerful.
void build_subsets(int *subset, int k, int already_built, int first_index) {
if (already_built == k) {
// Do something
}
else {
for (int i = first_index; i < 10; ++i) {
subset[already_built] = i;
build_subsets(subset, k, already_built + 1, i + 1);
}
}
}
EDIT: In case it's not entirely clear how you get this started, here's a complete program:
#include <iostream>
void build_subsets(int *subset, int k, int already_built, int first_index) {
if (already_built == k) {
for (int i = 0; i < k; ++i)
std::cout << subset[i] << ' ';
std::cout << '\n';
}
else {
for (int i = first_index; i < 10; ++i) {
subset[already_built] = i;
build_subsets(subset, k, already_built + 1, i + 1);
}
}
}
int main() {
int subset[3];
build_subsets(subset, 3, 0, 0);
}