In C++, vectors are used to store elements of similar data types. However, unlike arrays, the size of a vector can grow dynamically.
That is, we can change the size of the vector during the execution of a program as per our requirements.
Vectors are part of the C++ Standard Template Library. To use vectors, we need to include the vector
header file in our program.
#include <vector>
C++ Vector Declaration
Once we include the header file, here's how we can declare a vector in C++:
std::vector<T> vector_name;
The type parameter <T>
specifies the type of the vector. It can be any primitive data type such as int
, char
, float
, etc. For example,
vector<int> num;
Here, num is the name of the vector.
Notice that we have not specified the size of the vector during the declaration. This is because the size of a vector can grow dynamically so it is not necessary to define it.
C++ Vector Initialization
There are different ways to initialize a vector in C++.
Method 1:
// Initializer list
vector<int> vector1 = {1, 2, 3, 4, 5};
// Uniform initialization
vector<int> vector2 {1, 2, 3, 4, 5};
Here, we are initializing the vector by providing values directly to the vector. Now, both vector1
and vector2
are initialized with values 1, 2, 3, 4, 5.
Method 2:
vector<int> vector3(5, 12);
Here, 5 is the size of the vector and 12 is the value.
This code creates an int
vector with size 5 and initializes the vector with the value of 12. So, the vector is equivalent to
vector<int> vector3 = {12, 12, 12, 12, 12};
Example: C++ Vector Initialization
#include <iostream>
#include <vector>
using namespace std;
int main() {
// initializer list
vector<int> vector1 = {1, 2, 3, 4, 5};
// uniform initialization
vector<int> vector2{6, 7, 8, 9, 10};
// method 3
vector<int> vector3(5, 12);
cout << "vector1 = ";
// ranged loop
for (const int& i : vector1) {
cout << i << " ";
}
cout << "\nvector2 = ";
// ranged loop
for (const int& i : vector2) {
cout << i << " ";
}
cout << "\nvector3 = ";
// ranged loop
for (int i : vector3) {
cout << i << " ";
}
return 0;
}
Output
vector1 = 1 2 3 4 5 vector2 = 6 7 8 9 10 vector3 = 12 12 12 12 12
Here, we have declared and initialized three different vectors using three different initialization methods and displayed their contents.
Basic Vector Operations
The vector
class provides various methods to perform different operations on vectors. We will look at some commonly used vector operations in this tutorial:
- Add elements
- Access elements
- Change elements
- Remove elements
1. Add Elements to a Vector
To add a single element into a vector, we use the push_back()
function. It inserts an element into the end of the vector. For example,
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num {1, 2, 3, 4, 5};
cout << "Initial Vector: ";
for (const int& i : num) {
cout << i << " ";
}
// add the integers 6 and 7 to the vector
num.push_back(6);
num.push_back(7);
cout << "\nUpdated Vector: ";
for (const int& i : num) {
cout << i << " ";
}
return 0;
}
Output
Initial Vector: 1 2 3 4 5 Updated Vector: 1 2 3 4 5 6 7
Here, we have initialized an int
vector num with the elements {1, 2, 3, 4, 5}
. Notice the statements
num.push_back(6);
num.push_back(7);
Here, the push_back()
function adds elements 6
and 7
to the vector.
Note: We can also use the insert()
and emplace()
functions to add elements to a vector.
2. Access Elements of a Vector
In C++, we use the index number to access the vector elements. Here, we use the at() function to access the element from the specified index. For example,
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num {1, 2, 3, 4, 5};
cout << "Element at Index 0: " << num.at(0) << endl;
cout << "Element at Index 2: " << num.at(2) << endl;
cout << "Element at Index 4: " << num.at(4);
return 0;
}
Output
Element at Index 0: 1 Element at Index 2: 3 Element at Index 4: 5
Here,
num.at(0)
- access element at index 0num.at(2)
- access element at index 2num.at(4)
- access element at index 4
Note: Like an array, we can also use the square brackets []
to access vector elements. For example,
vector<int> num {1, 2, 3};
cout << num[1]; // Output: 2
However, the at()
function is preferred over []
because at()
throws an exception whenever the vector is out of bound, while []
gives a garbage value.
vector<int> num {1, 2, 3};
// gives garbage value
cout << num[4];
// throws an exception
cout << num.at(4);
3. Change Vector Element
We can change an element of the vector using the same at()
function. For example,
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num {1, 2, 3, 4, 5};
cout << "Initial Vector: ";
for (const int& i : num) {
cout << i << " ";
}
// change elements at indexes 1 and 4
num.at(1) = 9;
num.at(4) = 7;
cout << "\nUpdated Vector: ";
for (const int& i : num) {
cout << i << " ";
}
return 0;
}
Output
Initial Vector: 1 2 3 4 5 Updated Vector: 1 9 3 4 7
In the above example, notice the statements,
num.at(1) = 9;
num.at(4) = 7;
Here, we have assigned new values to indexes 1 and 4. So the value at index 1 is changed to 9 and the value at index 4 is changed to 7.
4. Delete Elements from C++ Vectors
To delete a single element from a vector, we use the pop_back()
function. For example,
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> prime_numbers{2, 3, 5, 7};
// initial vector
cout << "Initial Vector: ";
for (int i : prime_numbers) {
cout << i << " ";
}
// remove the last element
prime_numbers.pop_back();
// final vector
cout << "\nUpdated Vector: ";
for (int i : prime_numbers) {
cout << i << " ";
}
return 0;
}
Output
Initial Vector: 2 3 5 7 Updated Vector: 2 3 5
In the above example, notice the statement,
prime_numbers.pop_back();
Here, we have removed the last element (7) from the vector.
C++ Vector Functions
In C++, the vector header file provides various functions that can be used to perform different operations on a vector.
Function | Description |
---|---|
size() |
returns the number of elements present in the vector |
clear() |
removes all the elements of the vector |
front() |
returns the first element of the vector |
back() |
returns the last element of the vector |
empty() |
returns 1 (true) if the vector is empty |
capacity() |
check the overall size of a vector |
C++ Vector Iterators
Vector iterators are used to point to the memory address of a vector element. In some ways, they act like pointers in C++.
We can create vector iterators with the syntax
vector<T>::iterator iteratorName;
For example, if we have 2 vectors of int
and double
types, then we will need 2 different iterators corresponding to their types:
// iterator for int vector
vector<int>::iterator iter1;
// iterator for double vector
vector<double>::iterator iter2;
Initialize Vector Iterators
We can initialize vector iterators using the begin()
and end()
functions.
1. begin() function
The begin()
function returns an iterator that points to the first element of the vector. For example,
vector<int> num = {1, 2, 3};
vector<int>::iterator iter;
// iter points to num[0]
iter = num.begin();
2. end() function
The end()
function points to the theoretical element that comes after the final element of the vector. For example,
// iter points to the last element of num
iter = num.end() - 1;
Here, due to the nature of the end()
function, we have used the code num.end() - 1
to point to the last element of the num vector i.e. num[2].
Example: C++ Vector Iterators
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num {1, 2, 3, 4, 5};
// declare iterator
vector<int>::iterator iter;
// initialize the iterator with the first element
iter = num.begin();
// print the vector element
cout << "num[0] = " << *iter << endl;
// iterator points to the 3rd element
iter = num.begin() + 2;
cout << "num[2] = " << *iter;
// iterator points to the last element
iter = num.end() - 1;
cout << "num[4] = " << *iter;
return 0;
}
Output
num[0] = 1 num[2] = 3 num[4] = 5
In this program, we have declared an int
vector iterator iter in order to use it with the vector num.
// declare iterator
vector<int>::iterator iter;
Then, we initialized the iterator to the first element of the vector using the begin()
function.
// initialize the iterator with the first element
iter = num.begin();
Then, we printed the vector element by dereferencing the iterator:
// print the vector element
cout << "num[0] = " << *iter << endl;
Then, we printed the 3rd element of the vector by changing the value of iter to num.begin() + 2
.
Finally, we printed the last element of the vector using the end()
function.
Example: Iterate Through Vector Using Iterators
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num {1, 2, 3, 4, 5};
// declare iterator
vector<int>::iterator iter;
// use iterator with for loop
for (iter = num.begin(); iter != num.end(); ++iter) {
cout << *iter << " ";
}
return 0;
}
Output
1 2 3 4 5
Here, we have used a for
loop to initialize and iterate the iterator iter from the beginning of the vector to the end of the vector using the begin()
and end()
functions.
// use iterator with for loop
for (iter = num.begin(); iter != num.end(); ++iter) {
cout << *iter << " ";
}