I believe you're asking the wrong question here, and if you'll permit me a little bit of unwarranted psychology, I think it's because you're plagued by a little bit of self-doubt and low self-confidence.
Stop broadly comparing yourself to others
First of all, you can't compare yourself on a broad level to other programmers. Even the rock stars that you may look up to right now likely have problems (sloppiness, Yet Another Way Of Doing Things, and attitude problems), so don't worry about whether you compare to them. Instead, your approach should be to acquire as many mentors as you can, glean all the knowledge possible, and become better by watching and mimicking experts.
Learn to learn
Also, the best approach to becoming a better programmer and learner in general is not in learning specific things, or understanding by memory. IMO, rote memorization is the lowest form of learning. It's like a program that's missing the crucial "processing" step of Input->Process->Output. Teach yourself concepts like the ones you mentioned in your question. Broad understanding of programming is where you provide the most value. Learning a new language within paradigms you're familiar with is cakewalk compared to learning how to problem solve.
And now, for some poor advice from someone only a little older than you
One of the biggest mistakes I made as a young man was that I made everyone else's decisions for them by assuming I wasn't good enough, and that my time and talent were not worth their time and money. I constantly undersold my abilities and my talent, sparse though it may have been at the time. This was a huge mistake.
What you need to understand is that even a moderately decent programmer seems like a wizard to average everyday joe. They may hate you, they may get sick of always having to ask a local nerd how to turn their computer on, but because they lack insight and understanding into what you do, no matter how trivial and simple it seems to you, it is impossible to them.
People WILL pay you for your time, your talent, and your energy. There are enough absolutely terrible programmers in our industry that are making a killing simply because they can sit in a seat and (arguably) write basic programs. Play your cards right by developing some self-confidence through achievement, practice your speaking and body language, continue mastering your craft by always looking for things you don't know, and run toward those things to seek more understanding, and finally: stop downplaying the skills you've developed.
I feel like I only know a small portion of the standard library of my languagethis sentence should be the official C++ motto. – ZJR Aug 27 '11 at 21:02