Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does storing references (not pointers) in containers in C++ not work?

In my program I have a STL set.

set<string> myStrings; 

To improve the efficiency of my code I changed it to hold, only pointers. (I don't need actual string copies to be stored.)

set<string*> myStrings; 

I have read that it is a good practice to substitute pointers with references when possible. (Of course, only if the actual functionality of a pointer is not needed.)

set<string&> myStrings; 

The latter one gives me a lot of compiler errors, though. Why is it not possible to use references as container elements?

like image 341
Julian Lettner Avatar asked Oct 24 '10 23:10

Julian Lettner


People also ask

Are references more efficient than pointers?

It's much faster and memory-efficient to copy a reference than to copy many of the things a reference is likely to refer to. Pointers almost always point to data allocated on the heap. Pointers can be (and frequently are) null.

Why are references safer than pointers?

In C++, Reference variables are safer than pointers because reference variables must be initialized and they cannot be changed to refer to something else once they are initialized.

Why do we need references when we have pointers?

Pointers: A pointer is a variable that holds memory address of another variable. A pointer needs to be de referenced with * operator to access the memory location it points to.

Does a reference store an address C++?

References don't have their own addresses. Although references may be implemented as pointers, there is no need or guarantee of this. The C++ FAQ says it best: Unlike a pointer, once a reference is bound to an object, it can not be "reseated" to another object.


1 Answers

Containers store objects. References are not objects.

The C++11 specification clearly states (§23.2.1[container.requirements.general]/1):

Containers are objects that store other objects.

like image 90
James McNellis Avatar answered Oct 02 '22 11:10

James McNellis