#include <iostream>
#include <iterator>
#include <string>
#include <vector>
#include <memory>
#include <unordered_map>
struct Employee {
std::string FirstName;
std::string LastName;
};
typedef std::vector<std::shared_ptr<Employee>> Employees;
typedef std::unordered_map<std::string, Employees> EmployeeByLookup;
std::istream& operator>>(std::istream& is, Employee& e) {
return is >> e.FirstName >> e.LastName;
}
std::ostream& operator<<(std::ostream& o, const Employee& e) {
return o << e.FirstName << " " << e.LastName;
}
std::ostream& operator<<(std::ostream& o, const Employees& employees) {
o << "[";
if (!employees.empty())
{
for(auto e = employees.cbegin(); e != employees.cend()-1; ++e)
o << **e << ", ";
o << *(employees.back());
}
o << "]";
return o;
}
EmployeeByLookup CreateDepartmentMap() {
using std::cin;
EmployeeByLookup map;
while(cin)
{
std::string department;
cin >> department;
if (department.empty())
break;
auto employee = std::make_shared<Employee>();
cin >> *employee;
map[department].push_back(employee);
}
return map;
}
int main() {
using namespace std;
EmployeeByLookup departmentMap = CreateDepartmentMap();
cout << "All employees" << endl;
for (auto& x: departmentMap)
cout << "Department: " << x.first << "\n\t" << x.second << std::endl;
cout << "--------------" << endl;
string lookFor = "P+0$i";
if (departmentMap.find(lookFor) != departmentMap.end()) {
cout << "Department \"" << lookFor << "\" has "
<< departmentMap[lookFor].size() << " employees." << endl
<< departmentMap[lookFor] << endl;
}
return 0;
}