vector
TypeA vector
is a collection of objects, all of which have the same type. Every object in the collection has an associated index, which gives access to that object. A vector
is often referred to as a container because it “contains” other objects. We’ll have much more to say about containers in Part II.
To use a vector
, we must include the appropriate header. In our examples, we also assume that an appropriate using
declaration is made:
#include <vector>
using std::vector;
A vector
is a class template. C++ has both class and function templates. Writing a template requires a fairly deep understanding of C++. Indeed, we won’t see how to create our own templates until Chapter 16! Fortunately, we can use templates without knowing how to write them.
Templates are not themselves functions or classes. Instead, they can be thought of as instructions to the compiler for generating classes or functions. The process that the compiler uses to create classes or functions from templates is called instantiation. When we use a template, we specify what kind of class or function we want the compiler to instantiate.
For a class template, we specify which class to instantiate by supplying additional information, the nature of which depends on the template. How we specify the information is always the same: We supply it inside a pair of angle brackets following the template’s name.
In the case of vector
, the additional information we supply is the type of the objects the vector
will hold:
vector<int> ivec; // ivec holds objects of type int
vector<Sales_item> Sales_vec; // holds Sales_items
vector<vector<string>> file; // vector whose elements are vectors
In this example, the compiler generates three distinct types from the vector
template: vector<int>
, vector<Sales_item>
, and vector<vector<string>>
.
vector
is a template, not a type. Types generated from vector
must include the element type, for example, vector<int>
.
We can define vector
s to hold objects of most any type. Because references are not objects (§ 2.3.1, p. 50), we cannot have a vector
of references. However, we can have vector
s of most other (nonreference) built-in types and most class types. In particular, we can have vector
s whose elements are themselves vector
s.
It is worth noting that earlier versions of C++ used a slightly different syntax to define a vector
whose elements are themselves vector
s (or another template type). In the past, we had to supply a space between the closing angle bracket of the outer vector
and its element type—vector<vector<int> >
rather than vector<vector<int>>
.