#include <iostream>
#include <vector>
#include <set>

using namespace std;

template <typename Container>
std::ostream& Print(ostream& out, const Container& container);


template <typename Element>
ostream& operator<<(ostream& out, const set<Element>& container) {
    out << "{";
    Print(out, container);
    out << "}";
    return out;
}

template <typename Element>
ostream& operator<<(ostream& out, const vector<Element>& container) {
    out << "[";
    Print(out, container);
    out << "]";
    return out;
}

template <typename Container>
std::ostream& Print(ostream& out, const Container& container) {
    bool isnt_first = false;
    for (const auto& element : container) {
        if (isnt_first) {
            out << ", ";
        }
        else {
            isnt_first = true;
        }
        out << element;
    }
    return out;
}


int main() {

    //setlocale(LC_ALL, "ru");

    const set<string> cats = { "Мурка"s, "Белка"s, "Георгий"s, "Рюрик"s };
    cout << cats << endl;

    const vector<int> ages = { 10, 5, 2, 12 };
    cout << ages << endl;

    const vector<vector<string>> a = {
        { "Мурка"s, "Белка"s, "Георгий"s, "Рюрик"s },
        { "Мурка"s, "Белка"s, "Георгий"s, "Рюрик"s },
        { "Мурка"s, "Белка"s, "Георгий"s, "Рюрик"s }
    };
    cout << a << endl;
}
