std::set метод insert() крашит програму

Есть у меня код:

void fill_list(std::list<std::set<std::string>>& s,std::set<std::string>& all_toys,const int n){
    std::vector<std::string> vect;
    for(auto it = all_toys.begin(); it != all_toys.end(); it++){
        vect.push_back(*it);
    }

    auto it = s.begin();
    for(int i = 0; i < n; i++){
        for(unsigned int i = 0; i < all_toys.size(); i++){
            int tmp = rand() % vect.size() + 0;
            it->insert(vect[tmp]);
        }
    it++;
    }

}

Его суть в том что у меня есть список сетов,и каждый сет нужно рандомно заполнить элементами из общего сета где храняться строки,но почему-то при добавлении строки в сет програма крашиться,что не так?

n - кол-во елементов в списке сетов

Вызывающий код:

#include "header.h"

int main(){
    srand(time(NULL));
    int n;
    std::set<std::string> all_toys = {"Auto", "Bear", "Gun", "airplane" , "doll", "house", "guitar", "dog"};
    std::cout << "Enter n: ";
    std::cin >> n;
    
    std::list<std::set<std::string>> lst;
    
    fill_list(lst,all_toys,n);
    print_list(lst);

    return 0;
}

Ответы (2 шт):

Автор решения: Егор Красный

по пробуй

it->insert(vect[tmp-1]);

→ Ссылка
Автор решения: Stanislav Volodarskiy

Ошибка в том что вы итерируетесь по пустому списку.

Вот вариант, который решает вашу задачу по-другому. Функция distribute выделяет вектор множеств требуемой длины и распределяет элементы исходного множества в случайные элементы вектора:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <random>
#include <set>
#include <string>
#include <vector>

std::vector<std::set<std::string>> distribute(
    const std::set<std::string> source,
    int n
) {
    std::vector<std::set<std::string>> d(n);

    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<int> distr(0, n - 1);

    for (auto it = source.begin(); it != source.end(); ++it) {
        d[distr(gen)].insert(*it);
    }

    return d;
}

int main(){
    std::set<std::string> all_toys = {
        "Auto", "Bear", "Gun", "airplane", "doll", "house", "guitar", "dog"
    };
    std::cout << "Enter n: ";
    int n;
    std::cin >> n;
    
    std::vector<std::set<std::string>> d = distribute(all_toys, n);
    for (auto it = d.begin(); it != d.end(); ++it) {
        std::copy(
            it->begin(),
            it->end(),
            std::ostream_iterator<std::string>(std::cout, " ")
        );
        std::cout << '\n';
    }

    return 0;
}
→ Ссылка