 Parent directory
Parent directory
 Makefile
Makefile
 stl.cpp
stl.cpp
CC  = g++
CXX = g++
CFLAGS   = -g -Wall
CXXFLAGS = -g -Wall -std=c++20
executables = stl
.PHONY: default
default: $(executables)
stl: stl.o
.PHONY: clean
clean:
	rm -f *~ a.out core *.o $(executables)
.PHONY: all
all: clean default#include <array>
#include <vector>
#include <deque>
#include <list>
#include <forward_list>
#include <iostream>
using namespace std;
template <typename T, size_t N>
struct Array {
    // typedef T value_type;
    using value_type = T;
    // T(&)[N] is a reference to array of N elements of type T
    using TA = T(&)[N];
    T& operator[](int i) { return a[i]; }
    const T& operator[](int i) const { return a[i]; }
    constexpr size_t size() const { return N; }
    TA underlying() { return a; }
    T a[N];
};
void print_int(int x)  { cout << x << ' '; }
int main() {
    // 1. C Arrays
    //
    int a[5] { 100, 101, 102, 103, 104 };
    size_t n = sizeof(a) / sizeof(a[0]);
    for (size_t i = 0; i < n; ++i)  { print_int(a[i]); }
    // 2. Array class template
    //
    // Array<int,5> v { 100, 101, 102, 103, 104 };
    // for (size_t i = 0; i < v.size(); ++i)  { print_int(v[i]); }
    
    // constexpr size_t n = sizeof(v.underlying()) /
    //                      sizeof(decltype(v)::value_type);
    // static_assert(v.size() == n);
    // 3. std::array
    //
    // std::array<int,5> v { 100, 101, 102, 103, 104 };
    // for (size_t i = 0; i < v.size(); ++i)  { print_int(v[i]); }
    // 4. std::vector
    //
    // vector<int> v { 100, 101, 102, 103, 104 };
    // v.push_back(105);
    // for (size_t i = 0; i < v.size(); ++i)  { print_int(v[i]); }
    // 5. std::deque
    //
    // deque<int> v { 100, 101, 102, 103, 104 };
    // v.push_front(99);
    // v.push_back(105);
    // for (size_t i = 0; i < v.size(); ++i)  { print_int(v[i]); }
    // 6. std::list
    //
    // list<int> v { 100, 101, 102, 103, 104 };
    // v.push_front(99);
    // v.push_back(105);
    // while (!v.empty())  {
    //     print_int(v.front());
    //     v.pop_front();
    // }
    // 7. std::forward_list
    //
    // forward_list<int> v { 100, 101, 102, 103, 104 };
    // v.push_front(99);
    // while (!v.empty())  {
    //     print_int(v.front());
    //     v.pop_front();
    // }
    // static_assert(sizeof(forward_list<int>) == 8);
    cout << '\n';
}