#include <vector>
#include <algorithm>
#include <iostream>
#include <functional>

using namespace std;

template <typename Iterator>
inline bool next_combination(const Iterator first, Iterator k,
                             const Iterator last) {
    if ((first == last) || (first == k) || (last == k))
        return false;

    Iterator itr1 = first;
    Iterator itr2 = last;
    ++itr1;

    if (last == itr1)
        return false;

    itr1 = last;
    --itr1;
    itr1 = k;
    --itr2;

    while (first != itr1) {
        if (*--itr1 < *itr2) {
            Iterator j = k;

            while (!(*itr1 < *j)) ++j;

            std::iter_swap(itr1, j);
            ++itr1;
            ++j;
            itr2 = k;
            std::rotate(itr1, j, last);

            while (last != j) {
                ++j;
                ++itr2;
                }

            std::rotate(k, itr2, last);
            return true;
            }
        }

    std::rotate(first, k, last);
    return false;
    }

int main() {
    vector<int> combo = {1, 2, 3, 3, 3, 4, 5};
    sort(combo.begin(), combo.end());
    auto end = unique(combo.begin(), combo.end());
    auto begin = combo.begin();
    auto mid = begin + 3;

    do {
        for (auto iter = begin; iter != mid; ++iter)
            cout << *iter << " ";

        cout << endl;
        }
    while (next_combination(begin, mid, end));
    }
