Explicit bounds checks let code avoid reading outside a vector.

bounds check A vector index is safe only when it is greater than or equal to zero and less than the vector size.

Bounds Checks

index
bounds_checks.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
#include <vector>

int main() {
    std::vector<int> scores{72, 85, 91};
    int index = 2;

    bool inRange = index >= 0 && index < static_cast<int>(scores.size());
    int score = inRange ? scores[index] : -1;

    std::cout << "index=" << index << std::endl;
    std::cout << "inRange=" << inRange << std::endl;
    std::cout << "score=" << score << std::endl;
    return 0;
}
#include <iostream>
#include <vector>

int main() {
    std::vector<int> scores{72, 85, 91};
    int index = 0;

    bool inRange = index >= 0 && index < static_cast<int>(scores.size());
    int score = inRange ? scores[index] : -1;

    std::cout << "index=" << index << std::endl;
    std::cout << "inRange=" << inRange << std::endl;
    std::cout << "score=" << score << std::endl;
    return 0;
}
#include <iostream>
#include <vector>

int main() {
    std::vector<int> scores{72, 85, 91};
    int index = 5;

    bool inRange = index >= 0 && index < static_cast<int>(scores.size());
    int score = inRange ? scores[index] : -1;

    std::cout << "index=" << index << std::endl;
    std::cout << "inRange=" << inRange << std::endl;
    std::cout << "score=" << score << std::endl;
    return 0;
}
  1. scores ← [72, 85, 91], index ← 2, inRange ← 1, score ← 91

    4int main() {5    std::vector<int> scores→ [72, 85, 91]{72, 85, 91};6    int index→ 2 = 2; //@index=0, 578    bool inRange→ 1 = index2 >= 0 && index < static_cast<int>(scores[72, 85, 91].size());9    int score→ 91 = inRange1 ? scores[72, 85, 91][index2] : -1;1011    std::cout << "index=" << index2 << std::endl;12    std::cout << "inRange=" << inRange1 << std::endl;13    std::cout << "score=" << score91 << std::endl;14    return 0;15}
    outputindex=2
    inRange=1
    score=91
  1. scores ← [72, 85, 91], index ← 0, inRange ← 1, score ← 72

    4int main() {5    std::vector<int> scores→ [72, 85, 91]{72, 85, 91};6    int index→ 0 = 0;78    bool inRange→ 1 = index0 >= 0 && index < static_cast<int>(scores[72, 85, 91].size());9    int score→ 72 = inRange1 ? scores[72, 85, 91][index0] : -1;1011    std::cout << "index=" << index0 << std::endl;12    std::cout << "inRange=" << inRange1 << std::endl;13    std::cout << "score=" << score72 << std::endl;14    return 0;15}
    outputindex=0
    inRange=1
    score=72
  1. scores ← [72, 85, 91], index ← 5, inRange ← 0, score ← -1

    4int main() {5    std::vector<int> scores→ [72, 85, 91]{72, 85, 91};6    int index→ 5 = 5;78    bool inRange→ 0 = index5 >= 0 && index < static_cast<int>(scores[72, 85, 91].size());9    int score→ -1 = inRange0 ? scores[72, 85, 91][index5] : -1;1011    std::cout << "index=" << index5 << std::endl;12    std::cout << "inRange=" << inRange0 << std::endl;13    std::cout << "score=" << score-1 << std::endl;14    return 0;15}
    outputindex=5
    inRange=0
    score=-1