#include #include #include #include #include #include #include struct Process { std::string name { }; std::vector resources { }; }; std::istream& operator>>(std::istream& is, Process& process) { Process result { }; std::string line { }; std::getline(is, line); std::istringstream iss { line }; std::getline(iss, result.name, ':'); std::copy(std::istream_iterator{ iss }, std::istream_iterator{ }, std::back_inserter(result.resources)); std::sort(std::begin(result.resources), std::end(result.resources)); process = std::move(result); return is; } std::ostream& operator<<(std::ostream& os, Process const& process) { os << process.name << ": "; std::copy(std::begin(process.resources), std::end(process.resources), std::ostream_iterator{ os, " " }); return os; } int main() { std::ifstream ifs { "processes.txt" }; std::vector processes { std::istream_iterator { ifs }, std::istream_iterator { } }; std::cout << "Enter resources that are busy: "; std::set busy_resources { std::istream_iterator{ std::cin }, std::istream_iterator { } }; processes.erase( std::remove_if(std::begin(processes), std::end(processes), [&busy_resources](Process const& process) { std::vector overlap { }; std::set_intersection( std::begin(process.resources), std::end(process.resources), std::begin(busy_resources) , std::end(busy_resources), std::back_inserter(overlap)); return overlap.size() > 0; }), std::end(processes)); std::cout << "Processs that can run unhindered:" << std::endl; std::copy(std::begin(processes), std::end(processes), std::ostream_iterator{ std::cout, "\n" }); }