1) V norme jazyka je definovane ze \n znamena new-line. Neni tam nic o tom, ze by to melo znamenat LF.
Pokud chces zapisovat vyslovene x0A, tak to samozrejme muzes delat rucne. Jazyk s tim problem nema.
Mnohem casteji nez zapisovat nejake arbitrary znaky chces proste ukoncit radek. Takze je to za mne i logicke reseni.
2) Jednoduche a obvykle dostatecne rychle je proste normalni appendovani ke stringu. Realokace se deji vzdy na dvojnasobek, nebo velikost noveho stringu, podle toho co je vetsi. Tedy vetsinou nerealokujes tolikrat, kolikrat pridavas. Stat se to ofc muze pri supernevhodne rade, kterou spojujes. Kdyz znas vyslednou velikost, tak se zvetseni kapacity samozrejme oplati udelat manualne.
Co je treba rict je, ze castokrat by slo udelat vsechny stringove konkatenace uz v compiletimu. Bohuzel z mne neznamych duvodu std::string neni kompletne constexpr (nejspis opomenuti), takze to na standardnim std::stringu nepoujde. Vyjimecne tedy, pri maximalni optimalizaci, se oplati pouzivat i jine nez implementace, nez ty ze STL.