If you have problems with the O-notation, then 'Introduction to algorithms' by Cormen et.al. introduces these theoretic concepts in an easy to understand style. Well, this book is basically the bible for basic data structures. The proofs of runtime/space bounds are always presented in a very instructive fashion.
As always, if you study such book, do not just read it, but try to work on most of the exercises. Usually, doing this is very effective for learning the stuff.
Another general technique: try to join a local study group of 2-3 other students - usually, discussing the material with others (face to face) and while trying to explain the self-studied material to peers gives you a lot of hints, which things you need to cover more.
To master C++ for the exercises, 'The C++ Programming Language' by Stroustrup gives a good introduction and reference to the various language concepts. Since C++ is such a multi-paradigm language, beginners often are confused what of the concepts actually to use in practice to solve certain problems. To help with that 'Effective C++' by Scott Myers is a good start.
If your course makes heavy use of the STL, then there is 'Effective STL' as well. Scott Myers writing style is usually regarded as very 'fitting' for beginners.