C++ Vectors

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 0
  • num.at(2) - access element at index 2
  • num.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 << "  ";
}
Did you find this article helpful?