#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <random>
#include <vector>
 
int main()
{
    using v_str = std::vector<std::string>;
    auto print_v = [](const v_str &v)
    {
        std::copy(v.cbegin(), v.cend(), std::ostream_iterator<std::string>(std::cout, "\n"));
        std::cout << "***************\n";
    };
    auto lessLength = [](const std::string &lhs, const std::string &rhs)
    {
        return lhs.length() < rhs.length();
    };
 
    std::uniform_int_distribution<char> charDist('a', 'z');
    std::uniform_int_distribution<int> lengthDist(1, 15);
    std::default_random_engine gen{ std::random_device()() };
    std::function<char()> charGen = std::bind(charDist, gen);
    std::function<int()> lengthGen = std::bind(lengthDist, gen);
 
    const size_t numWords = 7;
    v_str words(numWords);
    std::generate(words.begin(), words.end(), [&charGen, &lengthGen]
    {
        std::string result;
        std::generate_n(std::back_inserter(result), lengthGen(), charGen);
        return result;
    });
 
    print_v(words);
    words.erase(std::min_element(words.begin(), words.end(), lessLength));
    print_v(words);
}