// C++ program to illustrate vector type

#include <iostream>
#include <vector>
using namespace std;

int main() 
{
  // (1) initializer list
  vector<int> vector1 = {1, 2, 3, 4, 5};

  // (2) uniform initialization
  vector<int> vector2{6, 7, 8, 9, 10};

  // (3) method 3
  vector<int> vector3(5, 12);
  //                 ^^^         // 12 is stored in every element
  //                initial size


  /* ========================================
     Access method 1
     ======================================== */
  cout << "vector1 (index loop) = ";
  // Traditional loop with index
  for (int i = 0; i < vector1.size(); i++ )
  {
    cout << vector1[i] << "  ";
  }
  cout << "\n";

  /* ===========================================================
     Access method 2

     The at() function is preferred over [ ] because at() 
     throws an exception whenever the index is out of bound, 
     while [] gives a garbage value.
     =========================================================== */
  cout << "vector1 (index method) = ";
  // Traditional loop with at() method
  for (int i = 0; i < vector1.size(); i++ )
  {
    cout << vector1.at(i) << "  ";  // at( ) is a method in vector1 class
  }
  cout << "\n";

  cout << "vector1 = ";
  // ranged loop
  for (const int& i : vector1) {
    cout << i << "  ";
  }
  cout << "\n";

  cout << "vector2 = ";

  // ranged loop
  for (const int& i : vector2) {
    cout << i << "  ";
  }
  cout << "\n";

  cout << "vector3 = ";

  // ranged loop
  for (int i : vector3) {
    cout << i << "  ";
  }
  cout << "\n";

  return 0;
}
