Templates make it possible to write small algorithms that work with containers of different value types.

generic algorithm A generic algorithm focuses on the operations it needs, such as adding values, instead of one concrete type.

Generic Algorithms

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

template <typename T>
T sumValues(const std::vector<T>& values) {
    T total{};

    for (T value : values) {
        total += value;
    }

    return total;
}

int main() {
    int bonus = 2;
    int extra = 4;

    std::vector<int> scores{3, bonus, extra};
    int total = sumValues(scores);

    std::cout << "count=" << scores.size() << std::endl;
    std::cout << "total=" << total << std::endl;
    return 0;
}
#include <iostream>
#include <vector>

template <typename T>
T sumValues(const std::vector<T>& values) {
    T total{};

    for (T value : values) {
        total += value;
    }

    return total;
}

int main() {
    int bonus = 0;
    int extra = 4;

    std::vector<int> scores{3, bonus, extra};
    int total = sumValues(scores);

    std::cout << "count=" << scores.size() << std::endl;
    std::cout << "total=" << total << std::endl;
    return 0;
}
#include <iostream>
#include <vector>

template <typename T>
T sumValues(const std::vector<T>& values) {
    T total{};

    for (T value : values) {
        total += value;
    }

    return total;
}

int main() {
    int bonus = 5;
    int extra = 4;

    std::vector<int> scores{3, bonus, extra};
    int total = sumValues(scores);

    std::cout << "count=" << scores.size() << std::endl;
    std::cout << "total=" << total << std::endl;
    return 0;
}
#include <iostream>
#include <vector>

template <typename T>
T sumValues(const std::vector<T>& values) {
    T total{};

    for (T value : values) {
        total += value;
    }

    return total;
}

int main() {
    int bonus = 2;
    int extra = 1;

    std::vector<int> scores{3, bonus, extra};
    int total = sumValues(scores);

    std::cout << "count=" << scores.size() << std::endl;
    std::cout << "total=" << total << std::endl;
    return 0;
}
#include <iostream>
#include <vector>

template <typename T>
T sumValues(const std::vector<T>& values) {
    T total{};

    for (T value : values) {
        total += value;
    }

    return total;
}

int main() {
    int bonus = 2;
    int extra = 8;

    std::vector<int> scores{3, bonus, extra};
    int total = sumValues(scores);

    std::cout << "count=" << scores.size() << std::endl;
    std::cout << "total=" << total << std::endl;
    return 0;
}
  1. bonus ← 2, extra ← 4, scores ← [3, 2, 4], total ← 9

    15int main() {16    int bonus→ 2 = 2; //@bonus=0, 517    int extra→ 4 = 4; //@extra=1, 81819    std::vector<int> scores→ [3, 2, 4]{3, bonus, extra};20    int total→ 9 = sumValues(scores[3, 2, 4]);2122    std::cout << "count=" << scores[3, 2, 4].size() << std::endl;23    std::cout << "total=" << total9 << std::endl;24    return 0;25}
    outputcount=3
    total=9
  1. bonus ← 0, extra ← 4, scores ← [3, 0, 4], total ← 7

    15int main() {16    int bonus→ 0 = 0;17    int extra→ 4 = 4;1819    std::vector<int> scores→ [3, 0, 4]{3, bonus, extra};20    int total→ 7 = sumValues(scores[3, 0, 4]);2122    std::cout << "count=" << scores[3, 0, 4].size() << std::endl;23    std::cout << "total=" << total7 << std::endl;24    return 0;25}
    outputcount=3
    total=7
  1. bonus ← 5, extra ← 4, scores ← [3, 5, 4], total ← 12

    15int main() {16    int bonus→ 5 = 5;17    int extra→ 4 = 4;1819    std::vector<int> scores→ [3, 5, 4]{3, bonus, extra};20    int total→ 12 = sumValues(scores[3, 5, 4]);2122    std::cout << "count=" << scores[3, 5, 4].size() << std::endl;23    std::cout << "total=" << total12 << std::endl;24    return 0;25}
    outputcount=3
    total=12
  1. bonus ← 2, extra ← 1, scores ← [3, 2, 1], total ← 6

    15int main() {16    int bonus→ 2 = 2;17    int extra→ 1 = 1;1819    std::vector<int> scores→ [3, 2, 1]{3, bonus, extra};20    int total→ 6 = sumValues(scores[3, 2, 1]);2122    std::cout << "count=" << scores[3, 2, 1].size() << std::endl;23    std::cout << "total=" << total6 << std::endl;24    return 0;25}
    outputcount=3
    total=6
  1. bonus ← 2, extra ← 8, scores ← [3, 2, 8], total ← 13

    15int main() {16    int bonus→ 2 = 2;17    int extra→ 8 = 8;1819    std::vector<int> scores→ [3, 2, 8]{3, bonus, extra};20    int total→ 13 = sumValues(scores[3, 2, 8]);2122    std::cout << "count=" << scores[3, 2, 8].size() << std::endl;23    std::cout << "total=" << total13 << std::endl;24    return 0;25}
    outputcount=3
    total=13