Sporo już było powiedziane, ale dodam coś jeszcze od siebie.
Podstawa to pisanie kodu w stylu C++ a nie C. Obiektowo i z wykorzystaniem nowych standardów. Im nowszy standard tym lepiej. Minimum C++11.
Co mam na myśli:
- STL: naucz się korzystać z kontenerów i iteratorów; które kontenery do czego się nadają; na jakich strukturach są zbudowane i jakie złożoności z tego wynikają; jest sporo fajnych artykułów z benchmarkami potwierdzającymi te "dziwne" O(n^2)
- nagłówek <algorithm>; naucz się stosować takie konstrukcje:
vec.erase(std::remove(vec.begin(), vec.end(), number_in), vec.end());
zamiast pisać wszystko pętlami;
- wyrażenia lambda, np
int count = std::count_if(v.begin(), v.end(), [](int i){return i % 3 == 0;});
- smart pointery: zapoznaj się z nagłówkiem <memory>, unique_ptr, shared_ptr; poczytaj czym są i po co są, ale naucz się też z nich korzystać, bo to wyjdzie jak nie będziesz umiał przesłać unique_ptr'a do funkcji
- i tutaj wchodzi semantyka przenoszenia, referencje do rvalue, std::move; żeby Ci się słabo nie robiło jak zobaczysz dwa ampersandy gdzieś w dokumentacji :D
- poczytaj jakieś guideline'sy, np od googla, nie musisz się do nich stosować, ale wg mnie jest to dosyć dobre źródło wiedzy
To tak na szybko z ważnych części języka. Jak się tego nauczyć? Oczywiście praktyka czyni mistrza. Ale polecam też wertować troche dokumentacje. Bardzo dużo można się tam nauczyć. Czytaj artykuły i ciekawe pytania odnośnie niejasnych części języka na stackoverflow (szczerze mówiąc najwięcej się z nich nauczyłem :D).
Z bibliotek zewnętrznych polecam:
- boost - zbiór gotowych narzędzi ogólnego zastosowania; dobrze wiedzieć co tam już jest napisane, żeby nie odkrywać koła na nowo
- jakiś framework do pisania testów, osobiście korzystam z gtest i gmock, całkiem przyjemnie się w tym pisze
- GSL
O projektowaniu obiektowym nie wspominam, bo wracasz z Javy, która jest bardziej zorientowana obiektowo