10.2. Accessing elements

The [] operator reads and writes the elements of a vector in much the same way it accesses the characters in an string. This is called vector indexing. As with strings, the indices start at zero, so count[0] refers to the "zeroeth" (or first) element of the vector, and count[1] refers to the second element. You can use the [] operator anywhere in an expression:

std::vector<int> count(5);
count[0] = 7;              // assignment
int first = count[0];      // access
count[1] = count[0] * 2;
++count[2];
count[3] -= 60;

All of these are legal assignment statements. The effect of this code fragment is:

diagram showing values assigned to vector elements

Fig. 10.3 Vector assignment

Warning

Since elements of this vector are numbered from 0 to 4, there is no element with the index 5. It is a common error to go beyond the bounds of a vector, which causes a run-time error (if you are lucky. The program may print an error and quit or it may simply produce incorrect results, but continue running.

You can use any expression as an index, using an unsigned size type such as std::size_t. A common way to index a vector is with a loop variable. For example:

std::size_t i = 0;
while (i < 5) {
  cout << count[i] << '\n';
  ++i;
}

This while loop counts from 0 to 5; when the loop variable i is 5, the condition fails and the loop terminates. Thus, the body of the loop is only executed when i is 0, 1, 2, 3, and 4.

Each time through the loop we use i as an index into the vector, outputting the ith element. This type of vector traversal is very common.

Take a look at the active code below. We can modify the vectors by accessing its elements.

Example accessing_elements_AC_1
 1#include <cstddef>   // std::size_t
 2#include <iostream>
 3#include <vector>
 4
 5using std::cout;
 6
 7void print_vec(std::vector<int> data) {
 8    cout << '[';
 9    std::size_t i = 0;
10    while (i < data.size()) {
11        cout <<  data[i] << ',';
12        ++i;
13    }
14    cout << "]\n";
15}
16
17int main() {
18    // notice we used a list to initialize values
19    std::vector<int> count = {1,2,3,4};
20    cout << "Before we make any changes, count = "; print_vec(count);
21    count[0] = 7;
22    count[1] = count[0] * 2;
23    ++count[2];
24    count[3] -= 60;
25    cout << "After we made the above changes, count = "; print_vec(count);
26}

Note we use the type std::size_t instead of int in this example. The data type returned from the vector size function is std::size_t. It is a type capable of storing the largest possible array (or vector) index on your computer. The maximum size will vary among different types of computers.

Q1

Multiple Response How would you increment the third element of vector<int> vec by one?

Q2

What is the highest index reached by while(i < 7)?