A couple things:
1. What you're talking about is called "instancing" - plenty of good info about this online; I'll have a look for you later when I have more time 

2. Consider soon switching to another vector/matrix library instead of using the [deprecated!!] glTranslate/glRotate stuff. I *HIGHLY* recommend 
GLM, which is essentially a templated C++ implementation of GLSL with added support for those old matrix functions. For instance, to set up some matrices in fixed-function OpenGL (probably with some mistakes; been awhile since I used them, hehe):
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, 16.0 / 9.0, 1.0, 1000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -20.0f); // Notice here we're actually setting up a view AND world matrix as one, which is not good (often it's quite nice to have separate matrices)
glRotatef(yRotation, 0.0f, 1.0f, 0.0f);
...and GLM:
mat4 proj = perspective(35.0f, 16.0f / 9.0f, 1.0f, 1000.0f);
mat4 view;
view = translate(view, vec3(0.0f, 0.0f, -20.0f));
view = rotate(view, yRotation, vec3(0.0f, 1.0f, 0.0f));
mat4 world; // Now we can have a separate matrix for world stuff :)
and of course you can make combinations for speed:
mat4 projView = proj * view;
mat4 projViewWorld = projView * world;
mat4 viewWorld = view * world;
And then just upload which matrices you need to your vertex shader (as uniforms), so you don't have to do all this matrix multiplication on the GPU. The REALLY kickass thing with glm is that if you know glsl, you know glm 

 .
Anyways, back on the subject: it's called instancing, and you can probably find some good stuff about it with google 

 feel free to post your findings; I don't actually know much about it myself and I'm quite curious.