Nie wiem czy to będzie wystarczająco mądrze? Ja w każdym razie [w tym przypadkowym razie] zoptymalizowałbym w ten sposób, że znacznie, ale to znacznie skróciłbym czas na oczekiwanie danych, których już więcej nie ma i już nie będzie - skończył się wraz z końcem plik z danymi [eof].
Jak?
Np tak:
while (cin >> wybor) { // jeżeli udało się jeszcze coś wczytać to idę do pętli, jeżeli już nic nie ma to nie [wchodzę]
zamiast:
for ( ; ; ) // czekanie w nieskończoność w pętli, aż do tle [przekroczenia limitu czasu]