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 шт):
Автор решения: 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;
}