Vector
A random access dynamic container
Definition
The vector template is defined in the standard header <vector>, and in the nonstandard backward-compatibility header <vector.h>.#include <vector> namespace std { template <class T, class Allocator=allocator<T>> class vector; }
Description
A vector is a Sequence that manages a dynamic array whose elements are of any type T that are both assignable and copyable. A simple example of creating a vector is:std::vector<int> a; // creates an empty vector of integer type std::vector<float> b(10); // create a vector with 10 float types.With access to the vector contains performed in the usual C way:
std::cout<<a[0]<<std::endl; std::cout<<b[2]<<std::endl;The optional second parameter defines the memory model, which by default is an
allocator
.Performance
Vectors copy their elements into their internal dynamic array, whose elements are ordered. Vectors provide constant time random access to all of the data. Theiterators
are also random access iterators, therefore vectors can be used with any algorithm within STL.
Vectors provide good performance if you append (or delete) elements from the end of the container. If you insert or delete from any other position then the performance is poor, with every element after the insertion or deletion point being moved to maintain an ordered and continuous array of elements.Size And Capacity
One way vectors achieve good performance is to allocate more memory than then actually need for the purpose. To avoid reallocation you can use thereserve
command when you instantiate the container, i.e.
std::vector<int> v; v.reserve(80); // reserve memory for 80 elementsthis is equivalent to
std::vector<T> v(80);
Vector Operations
Create, Copy and Destroy OperationsOperation | Effect |
---|---|
vector< El > c | Creates an empty vector without any elements |
vector< El > c1(c2) | Creates a copy of another vector of the same type |
vector< El > c(n) | Creates a vector with n elements that are created using the default constructor of El |
vector< El > c(n,el) | Creates a vector initialized with n copies of element el |
vector< El > c(begin,end) | Creates a vector initialized with the elements from another container, defined by its iterators (begin, end) |
c.~vector< El >() | Destroys all elements and frees the memory |
Operation | Effect |
---|---|
c.size() | Returns the actual number of elements in the container |
c.empty() | Returns if the container is empty |
c.max_size() | Returns the maximum number of possible elements |
capacity() | Returns the maximum possible number of elements without memory reallocation |
reserve() | Enlarges the current max capacity of the container |
c1==c2 | Returns if c1 is equal to c2 |
c1!=c2 | Returns if c1 is not equal to c2 |
c1<c2 | Returns if c1 is less than c2 |
c1>c2 | Returns if c1 is greater than c2 |
c1<=c2 | Returns if c1 is less than or equal to c2 |
c1>=c2 | Returns if c1 is greater than or equal to c2 |
Operation | Effect |
---|---|
c1=c2 | Assigns all elements of c2 to c1 |
c.assign(b,elem) | Assigns n copies of element elem |
c.assign(begin,end) | Assigns the elements of the range [begin, end] |
c1.swap(c2) | Swaps the data of c1 and c2 |
swap(c1,c2) | Same (as global function) |
Operation | Effect |
---|---|
c.at(i) | Returns the element with index i (throws range error exception if i is out of range) |
c[i] | Returns the element with index i (without range checking) |
c.front() | Returns the first element (no check if there is a first element) |
c.back() | Returns the last element (no check if there is a last element) |
Operation | Effect |
---|---|
c.begin() | Returns a random access iterator for the first element |
c.end() | Returns a random access iterator for the position after the last element |
c.rbegin() | Returns a reverse iterator for the first element of a reverse iteration |
c.rend() | Returns a reverse iterator for the position after the last element of a reverse iteration |
Operation | Effect |
---|---|
c.insert(pos,El) | Inserts at iterator position pos a copy of El and returns the position of the new element |
c.insert(pos,nrEl,El) | Inserts at iterator position pos, nrEl copies of El (returns nothing) |
c.insert(pos,beg,end) | Inserts at iterator position pos a copy of all elements of the range [beg,end) (returns nothing) |
c.push_back(El) | Appends a copy of El at the end |
c.pop_back() | Removes the last element (does not return it) |
c.erase(pos) | Removes the element at iterator position pos and returns the position of the next element |
c.erase(beg,end) | Removes all elements of the range [beg,end) and returns the position of the next element |
c.resize(n) | Changes the number of elements to n (if size() grows new elements are created by their default constructor) |
c.resize(n,El) | Changes the number of elements to n (if size() grows new elements are copies of El |
c.clear() | Removes all elements |
References:
- http://www.sgi.com
- Nicolai M. Josuttis: "The C++ Standard Library"
Example:
Example - vector operations
Problem
The following program creates an empty vector of type int and then makes some operation using the vector.
Workings
#include<iostream> #include<vector> using namespace std; typedef vector<int> INTVECTOR; const SIZE=4; void main(void) { //dynamically allocated vector initially contains no elements INTVECTOR Vect; for (int i=0;i<SIZE;i++) Vect.push_back((i+1)*100); //initializes the vector with [100, 200, 300, 400] cout <<"First element is "<<Vect.front()<<"."<<endl; cout <<"Last element is "<<Vect.back()<<"."<<endl; cout <<"The vector contains "<<Vect.size()<<" elements."<<endl; cout <<"Erase the last element."<<endl; Vect.erase(Vect.end()-1); //erase the last element in the vector cout <<"The new last element is "<<Vect.back()<<"."<<endl; cout <<"Erase the first element."<<endl; Vect.erase(Vect.begin()); // erase the first element in the vector cout <<"The new first element is "<<Vect.front()<<"."<<endl; cout <<"The vector contains "<<Vect.size()<<"elements."<<endl; }
Solution
Output:
First element is 100.
Last element is 400.
The vector contains 4 elements.
Erase the last element.
The new last element is 300.
Erase the first element.
The new first element is 200.
The vector contains 2 elements.
Last element is 400.
The vector contains 4 elements.
Erase the last element.
The new last element is 300.
Erase the first element.
The new first element is 200.
The vector contains 2 elements.
References:
- http://www.yolinux.com
- http://www.smu.ca/academic/science/compsci
- Kris Jamsa, Lars Klander: "Jamsa's C/C++ Programmer's Bible"
- Stephen Prata: "C++ Primer Plus"