#include <iostream>
#include <vector>
#include <sstream>

class Combination
{
public:
    Combination(int n=1, int k=1);
    bool next_combination();
    int operator[](int i)const { return data[i]; }
private:
    int n;
    int k;
    std::vector<int> data;
};

Combination::Combination(int n, int k) : n(n), k(k)
{
    if (n<=0 || k<=0) n = k = 1;
    if (n<k) n = k;
    for (int i=0; i<k; ++i)
        data.push_back(i);
}

bool Combination::next_combination()
{
    if (n-k == data[0]) return false;
    int i = k-1;
    while (i>0 && data[i]==n-k+i) { --i; }
    ++data[i];
    for (int j=i; j<k-1; ++j)
        data[j+1] = data[j] + 1;
    return true;
}

int main()
{
    std::vector<std::string> mystrings;
    mystrings.push_back("string1");
    mystrings.push_back("string2");
    mystrings.push_back("string3");
    mystrings.push_back("string4");
    mystrings.push_back("string5");
    mystrings.push_back("string6");
    mystrings.push_back("string7");
    mystrings.push_back("string8");
    mystrings.push_back("string9");
    mystrings.push_back("string10");
    
    int n = mystrings.size();   // 10
    int k = mystrings.size()/2; // 5
    
    Combination mycombinator(n,k);
    int line = 1;
    
    do {
        std::cout << line++ << ") ";
        for (int i=0; i<k; ++i)
            std::cout << mystrings[mycombinator[i]] << " ";
        std::cout << "\n";
    } while (mycombinator.next_combination());
}