Ce qu'il faut savoir, c'est que cout n'affiche pas forcément immédiatement le texte que l'on lui demande d'afficher. Il peut très bien attendre d'avoir un certain nombre de caractère avant de effectivement les afficher.
Par défaut sur la plupart des terminaux, on attend d'avoir une ligne entière avant d'effectivement afficher la ligne. Mais lorsqu'on redirige la sortie du programme vers un fichier, la on va attendre bien plus. L'avantage c'est que plus on attend, et plus on gagne en performance quand on affiche/écrit beaucoup.
flush sert à vouloir dire "bon c'est bien ton mécanisme la, mais je veux que tu affiche mon texte tout de suite maintenant"
endl c'est presque le même principe : endl est un diminutif de "end line", et va en gros commencer une nouvelle ligne et afficher immédiatement la ligne précédente.
Pour simplifier :
cout << .... << endl;
est équivalent à :
cout << .... << "\n" << flush;
Maintenant une note pour les pro de C++ que nous sommes : dans ton cas, le flush n'est pas obligatoire, il y aura déjà un flush de fait. c'est dans la norme C++, cout et cin sont liés, je ne connais plus le terme exact mais bon. Un accès à cin va automatiquement flusher cout. Cela n'est vrai que pour cin et cout par contre.