Accessing vector elements in C++


We can access the data inside a vector using indices and the bracket notation ([]), just like we do for static arrays.

Vectors also use zero-based indexing, so the first element in a vector has an index of 0.

vector<int> array = {50, 60, 70};

cout << array[0] << endl; // Output: 50

int data = array[1];
cout << data << endl; // Output: 60

Assignment
Follow the Coding Tutorial and let's play with some arrays.


Hint
Look at the examples above if you get stuck.


Introduction

In this lesson, we will explore how to access elements in a vector in C++. Vectors are dynamic arrays that can grow and shrink in size, making them a versatile data structure in C++. Understanding how to access vector elements is fundamental for manipulating and utilizing data stored in vectors.

Accessing vector elements is significant in various programming scenarios, such as iterating through data, modifying elements, and performing calculations. This knowledge is essential for tasks ranging from simple data manipulation to complex algorithm implementations.

Understanding the Basics

Before diving into accessing vector elements, let's review some fundamental concepts:

Here is a simple example to illustrate these concepts:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> array = {50, 60, 70};
    std::cout << array[0] << std::endl; // Output: 50
    int data = array[1];
    std::cout << data << std::endl; // Output: 60
    return 0;
}

Main Concepts

Let's delve deeper into the key concepts and techniques for accessing vector elements:

Here is an example demonstrating these concepts:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> array = {10, 20, 30, 40, 50};
    
    // Accessing elements
    std::cout << "Element at index 2: " << array[2] << std::endl; // Output: 30
    
    // Modifying elements
    array[2] = 35;
    std::cout << "Modified element at index 2: " << array[2] << std::endl; // Output: 35
    
    // Out-of-bounds access (undefined behavior)
    // std::cout << array[10] << std::endl; // Uncommenting this line may cause a runtime error
    
    return 0;
}

Examples and Use Cases

Let's explore some examples and real-world use cases:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> scores = {85, 90, 78, 92, 88};
    
    // Calculate the average score
    int sum = 0;
    for (int i = 0; i < scores.size(); ++i) {
        sum += scores[i];
    }
    double average = static_cast<double>(sum) / scores.size();
    std::cout << "Average score: " << average << std::endl;
    
    // Find the maximum score
    int maxScore = scores[0];
    for (int i = 1; i < scores.size(); ++i) {
        if (scores[i] > maxScore) {
            maxScore = scores[i];
        }
    }
    std::cout << "Maximum score: " << maxScore << std::endl;
    
    return 0;
}

Common Pitfalls and Best Practices

When working with vectors, be mindful of the following common pitfalls and best practices:

Example of using the at() method:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> array = {10, 20, 30, 40, 50};
    
    try {
        std::cout << array.at(2) << std::endl; // Output: 30
        std::cout << array.at(10) << std::endl; // Throws out_of_range exception
    } catch (const std::out_of_range& e) {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
    
    return 0;
}

Advanced Techniques

For advanced usage, consider the following techniques:

Example of using iterators:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> array = {10, 20, 30, 40, 50};
    
    for (auto it = array.begin(); it != array.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

Code Implementation

Here is a complete code example demonstrating the correct use of accessing vector elements:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    
    // Accessing elements
    for (int i = 0; i < numbers.size(); ++i) {
        std::cout << "Element at index " << i << ": " << numbers[i] << std::endl;
    }
    
    // Modifying elements
    numbers[2] = 10;
    std::cout << "Modified element at index 2: " << numbers[2] << std::endl;
    
    // Using at() method
    try {
        std::cout << "Element at index 4: " << numbers.at(4) << std::endl;
        std::cout << "Element at index 10: " << numbers.at(10) << std::endl; // Throws exception
    } catch (const std::out_of_range& e) {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
    
    return 0;
}

Debugging and Testing

When debugging and testing code related to vector access, consider the following tips:

Example of a simple test case:

#include <iostream>
#include <vector>
#include <cassert>

void testVectorAccess() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    assert(vec[0] == 1);
    assert(vec[4] == 5);
    vec[2] = 10;
    assert(vec[2] == 10);
}

int main() {
    testVectorAccess();
    std::cout << "All tests passed!" << std::endl;
    return 0;
}

Thinking and Problem-Solving Tips

When approaching problems related to vector access, consider the following strategies:

Conclusion

In this lesson, we covered the essential concepts of accessing vector elements in C++. We discussed the basics, explored examples and use cases, highlighted common pitfalls, and introduced advanced techniques. Mastering these concepts is crucial for effective data manipulation and algorithm implementation in C++.

We encourage you to practice and explore further applications of vectors in your coding projects.

Additional Resources

For further reading and practice problems, consider the following resources: