Templates
Generic Algorithms
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
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;
}
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
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
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
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
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