The following series of questions can help you determine which type of container is best suited for solving a particular problem.
How are values going to be accessed?
If random access is important, than a vector or a deque should be used. If sequential access is sufficient, then one of the other structures may be suitable.
Is the order in which values are maintained in the collection important?
There are a number of different ways values can be sequenced. If a strict ordering is important throughout the life of the container, then the set data structure is an obvious choice, as insertions into a set are automatically placed in order. On the other hand, if this ordering is important only at one point (for example, at the end of a long series of insertions), then it might be easier to place the values into a list or vector, then sort the resulting structure at the appropriate time. If the order that values are held in the structure is related to the order of insertion, then a stack, queue, or list may be the best choice.
Will the size of the structure vary widely over the course of execution?
If true, then a list or set might be the best choice. A vector or deque will continue to maintain a large buffer even after elements have been removed from the collection. Conversely, if the size of the collection remains relatively fixed, than a vector or deque will use less memory than will a list or set holding the same number of elements.
Is it possible to estimate the size of the collection?
The vector data structure provides a way to pre-allocate a block of memory of a given size (using the reserve() member function). This ability is not provided by the other containers.
Is testing to see whether a value is contained in the collection a frequent operation?
If so, then the set or map containers would be a good choice. Testing to see whether a value is contained in a set or map can be performed in a very small number of steps (logarithmic in the size of the container), whereas testing to see if a value is contained in one of the other types of collections might require comparing the value against every element being stored by the container.
Is the collection indexed? That is, can the collection be viewed as a series of key/value pairs?
If the keys are integers between 0 and some upper limit, a vector or deque should be employed. If, on the other hand, the key values are some other ordered data type (such as characters, strings, or a user-defined type), the map container can be used.
Can values be related to each other?
All values stored in any container provided by the standard library must be able to test for equality against another similar value, but not all need to recognize the relational less-than operator. However, if values cannot be ordered using the relational less-than operator, they cannot be stored in a set or a map.
Is finding and removing the largest value from the collection a frequent operation?
If the answer is "yes," the priority queue is the best data structure to use.
At what positions are values inserted into or removed from the structure?
If values are inserted into or removed from the middle, then a list is the best choice. If values are inserted only at the beginning, a deque or a list is the preferred choice. If values are inserted or removed only at the end, a stack or queue may be a logical choice.
Is a frequent operation the merging of two or more sequences into one?
If so, a set or a list would seem to be the best choice, depending whether the collection is maintained in order. Merging two sets is a very efficient operation. If the collections are not ordered, but the efficient splice() member function from class list can be used, then the list data type is to be preferred, since this operation is not provided in the other containers.
In many situations any number of different containers may be applicable to a given problem. In such cases one possibility is to compare actual execution timings to determine which alternative is best.
©Copyright 1996, Rogue Wave Software, Inc.