#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <algorithm>
class Student {
private:
std::string name;
public:
Student(const std::string& name_) : name(name_) {}
const std::string& getName() const { return name; }
};
class Class {
private:
typedef std::vector<std::shared_ptr<Student>> SubscriptionList;
SubscriptionList students;
const unsigned int MaxSubscribers;
public:
Class(unsigned int maxSubscribers) : MaxSubscribers(maxSubscribers) {}
bool subscribe(std::shared_ptr<Student>& student) {
if(students.size() >= MaxSubscribers) {
return false; // Class is full, can't subscribe
}
// May be put additional checks here, to prevent multiple subscrptions
students.push_back(student);
return true; // Sucessfully subscribed the class
}
void unsubscribe(std::shared_ptr<Student>& student) {
SubscriptionList::iterator it = students.begin();
for(;it != students.end();++it) {
if(it->get() == student.get()) {
break;
}
}
students.erase(it);
}
void showSubscribedStudents(std::ostream& os) {
unsigned int i = 1;
for(SubscriptionList::iterator it = students.begin();
it != students.end();
++it, ++i) {
os << i << ". " << (*it)->getName() << std::endl;
}
}
};
int main()
{
unsigned int amount;
std::cin >> amount;
std::cin.ignore(1,'\n');
Class theClass(amount);
for(unsigned int i = 0; i <= amount; ++i)
{
std::string name;
std::getline(std::cin,name);
std::shared_ptr<Student> student(new Student(name));
theClass.subscribe(student);
}
theClass.showSubscribedStudents(std::cout);
}